// $ANTLR 3.4 PLSQL_DMLParser.g 2011-11-26 19:33:08

package com.polytech.diploma.OracleSQL;


import org.antlr.runtime.*;
import java.util.Stack;
import java.util.List;
import java.util.ArrayList;
import java.util.Map;
import java.util.HashMap;

import org.antlr.runtime.tree.*;


@SuppressWarnings({"all", "warnings", "unchecked"})
public class PLSQLParser_PLSQL_DMLParser extends Parser {
    public static final int EOF=-1;
    public static final int AMPERSAND=4;
    public static final int APPROXIMATE_NUM_LIT=5;
    public static final int ASSIGN_OP=6;
    public static final int ASTERISK=7;
    public static final int AT_SIGN=8;
    public static final int BIT_STRING_LIT=9;
    public static final int CHAR_STRING=10;
    public static final int COLON=11;
    public static final int COMMA=12;
    public static final int COMMENT=13;
    public static final int CONCATENATION_OP=14;
    public static final int DELIMITED_ID=15;
    public static final int DOUBLE_ASTERISK=16;
    public static final int DOUBLE_PERIOD=17;
    public static final int EQUALS_OP=18;
    public static final int EXACT_NUM_LIT=19;
    public static final int FOR_NOTATION=20;
    public static final int GREATER_THAN_OP=21;
    public static final int GREATER_THAN_OR_EQUALS_OP=22;
    public static final int HEX_STRING_LIT=23;
    public static final int INTRODUCER=24;
    public static final int LEFT_BRACKET=25;
    public static final int LEFT_PAREN=26;
    public static final int LESS_THAN_OP=27;
    public static final int LESS_THAN_OR_EQUALS_OP=28;
    public static final int MINUS_SIGN=29;
    public static final int NATIONAL_CHAR_STRING_LIT=30;
    public static final int NEWLINE=31;
    public static final int NOT_EQUAL_OP=32;
    public static final int PERCENT=33;
    public static final int PERIOD=34;
    public static final int PLSQL_NON_RESERVED_ELSIF=35;
    public static final int PLSQL_NON_RESERVED_MODEL=36;
    public static final int PLSQL_NON_RESERVED_USING=37;
    public static final int PLSQL_RESERVED_CLUSTERS=38;
    public static final int PLSQL_RESERVED_COLAUTH=39;
    public static final int PLSQL_RESERVED_COLUMNS=40;
    public static final int PLSQL_RESERVED_COMPRESS=41;
    public static final int PLSQL_RESERVED_CRASH=42;
    public static final int PLSQL_RESERVED_EXCLUSIVE=43;
    public static final int PLSQL_RESERVED_IDENTIFIED=44;
    public static final int PLSQL_RESERVED_IF=45;
    public static final int PLSQL_RESERVED_INDEX=46;
    public static final int PLSQL_RESERVED_INDEXES=47;
    public static final int PLSQL_RESERVED_LOCK=48;
    public static final int PLSQL_RESERVED_MINUS=49;
    public static final int PLSQL_RESERVED_MODE=50;
    public static final int PLSQL_RESERVED_NOCOMPRESS=51;
    public static final int PLSQL_RESERVED_NOWAIT=52;
    public static final int PLSQL_RESERVED_RESOURCE=53;
    public static final int PLSQL_RESERVED_SHARE=54;
    public static final int PLSQL_RESERVED_START=55;
    public static final int PLSQL_RESERVED_TABAUTH=56;
    public static final int PLSQL_RESERVED_VIEWS=57;
    public static final int PLUS_SIGN=58;
    public static final int QUESTION_MARK=59;
    public static final int REGULAR_ID=60;
    public static final int RIGHT_BRACKET=61;
    public static final int RIGHT_PAREN=62;
    public static final int SEMICOLON=63;
    public static final int SEPARATOR=64;
    public static final int SIMPLE_LETTER=65;
    public static final int SOLIDUS=66;
    public static final int SPACE=67;
    public static final int SQL92_RESERVED_ALL=68;
    public static final int SQL92_RESERVED_ALTER=69;
    public static final int SQL92_RESERVED_AND=70;
    public static final int SQL92_RESERVED_ANY=71;
    public static final int SQL92_RESERVED_AS=72;
    public static final int SQL92_RESERVED_ASC=73;
    public static final int SQL92_RESERVED_AT=74;
    public static final int SQL92_RESERVED_BEGIN=75;
    public static final int SQL92_RESERVED_BETWEEN=76;
    public static final int SQL92_RESERVED_BY=77;
    public static final int SQL92_RESERVED_CASE=78;
    public static final int SQL92_RESERVED_CHECK=79;
    public static final int SQL92_RESERVED_CONNECT=80;
    public static final int SQL92_RESERVED_CREATE=81;
    public static final int SQL92_RESERVED_CURRENT=82;
    public static final int SQL92_RESERVED_DECLARE=83;
    public static final int SQL92_RESERVED_DEFAULT=84;
    public static final int SQL92_RESERVED_DELETE=85;
    public static final int SQL92_RESERVED_DESC=86;
    public static final int SQL92_RESERVED_DISTINCT=87;
    public static final int SQL92_RESERVED_DROP=88;
    public static final int SQL92_RESERVED_ELSE=89;
    public static final int SQL92_RESERVED_END=90;
    public static final int SQL92_RESERVED_EXCEPTION=91;
    public static final int SQL92_RESERVED_EXISTS=92;
    public static final int SQL92_RESERVED_FALSE=93;
    public static final int SQL92_RESERVED_FETCH=94;
    public static final int SQL92_RESERVED_FOR=95;
    public static final int SQL92_RESERVED_FROM=96;
    public static final int SQL92_RESERVED_GOTO=97;
    public static final int SQL92_RESERVED_GRANT=98;
    public static final int SQL92_RESERVED_GROUP=99;
    public static final int SQL92_RESERVED_HAVING=100;
    public static final int SQL92_RESERVED_IN=101;
    public static final int SQL92_RESERVED_INSERT=102;
    public static final int SQL92_RESERVED_INTERSECT=103;
    public static final int SQL92_RESERVED_INTO=104;
    public static final int SQL92_RESERVED_IS=105;
    public static final int SQL92_RESERVED_LIKE=106;
    public static final int SQL92_RESERVED_NOT=107;
    public static final int SQL92_RESERVED_NULL=108;
    public static final int SQL92_RESERVED_OF=109;
    public static final int SQL92_RESERVED_ON=110;
    public static final int SQL92_RESERVED_OPTION=111;
    public static final int SQL92_RESERVED_OR=112;
    public static final int SQL92_RESERVED_ORDER=113;
    public static final int SQL92_RESERVED_OVERLAPS=114;
    public static final int SQL92_RESERVED_PRIOR=115;
    public static final int SQL92_RESERVED_PROCEDURE=116;
    public static final int SQL92_RESERVED_PUBLIC=117;
    public static final int SQL92_RESERVED_REVOKE=118;
    public static final int SQL92_RESERVED_SELECT=119;
    public static final int SQL92_RESERVED_SIZE=120;
    public static final int SQL92_RESERVED_SQL=121;
    public static final int SQL92_RESERVED_TABLE=122;
    public static final int SQL92_RESERVED_THEN=123;
    public static final int SQL92_RESERVED_TO=124;
    public static final int SQL92_RESERVED_TRUE=125;
    public static final int SQL92_RESERVED_UNION=126;
    public static final int SQL92_RESERVED_UNIQUE=127;
    public static final int SQL92_RESERVED_UPDATE=128;
    public static final int SQL92_RESERVED_VALUES=129;
    public static final int SQL92_RESERVED_VIEW=130;
    public static final int SQL92_RESERVED_WHEN=131;
    public static final int SQL92_RESERVED_WHERE=132;
    public static final int SQL92_RESERVED_WITH=133;
    public static final int UNDERSCORE=134;
    public static final int UNSIGNED_INTEGER=135;
    public static final int VERTICAL_BAR=136;
    public static final int ADD_VK=137;
    public static final int AFTER_VK=138;
    public static final int AGENT_VK=139;
    public static final int AGGREGATE_VK=140;
    public static final int ALIAS=141;
    public static final int ANALYZE_VK=142;
    public static final int ANY_ELEMENT=143;
    public static final int ANY_MODE=144;
    public static final int ARGUMENT=146;
    public static final int ARGUMENTS=147;
    public static final int ASSIGN=148;
    public static final int ASSOCIATE_VK=149;
    public static final int ATTRIBUTE_NAME=151;
    public static final int AT_VK=153;
    public static final int AUDIT_VK=154;
    public static final int AUTHID_VK=155;
    public static final int AUTOMATIC_VK=156;
    public static final int AUTONOMOUS_TRANSACTION_VK=157;
    public static final int AUTO_VK=158;
    public static final int BATCH_VK=159;
    public static final int BEFORE_VK=160;
    public static final int BFILE_VK=161;
    public static final int BINARY_DOUBLE_VK=162;
    public static final int BINARY_FLOAT_VK=163;
    public static final int BINARY_INTEGER_VK=164;
    public static final int BIT_VK=165;
    public static final int BLOB_VK=166;
    public static final int BLOCK_VK=167;
    public static final int BODY_VK=168;
    public static final int BOOLEAN_VK=169;
    public static final int BOTH_VK=170;
    public static final int BULK_VK=171;
    public static final int BYTE_VK=172;
    public static final int CACHE_VK=173;
    public static final int CALL_VK=174;
    public static final int CANONICAL_VK=175;
    public static final int CASCADE_VK=176;
    public static final int CASCATED_ELEMENT=177;
    public static final int CAST_VK=178;
    public static final int CHARACTER_VK=179;
    public static final int CHAR_CS_VK=180;
    public static final int CHAR_SET_NAME=181;
    public static final int CHAR_VK=183;
    public static final int CHR_VK=184;
    public static final int CLOB_VK=185;
    public static final int CLOSE_VK=186;
    public static final int CLUSTER_VK=187;
    public static final int COLLECTION_MODE=188;
    public static final int COLLECTION_NAME=189;
    public static final int COLLECT_VK=190;
    public static final int COLUMNS=192;
    public static final int COLUMN_NAME=193;
    public static final int COMMENT_VK=195;
    public static final int COMMITTED_VK=196;
    public static final int COMMIT_VK=197;
    public static final int COMPATIBILITY_VK=198;
    public static final int COMPILE_VK=199;
    public static final int COMPOUND_VK=200;
    public static final int CONDITIONAL_INSERT=202;
    public static final int CONSTANT_VK=203;
    public static final int CONSTRAINT_NAME=204;
    public static final int CONSTRUCTOR_VK=205;
    public static final int CONTENT_VK=206;
    public static final int CONTEXT_VK=207;
    public static final int CONTINUE_VK=208;
    public static final int CONVERT_VK=209;
    public static final int CORRUPT_XID_ALL_VK=210;
    public static final int CORRUPT_XID_VK=211;
    public static final int COST_CLASS_NAME=212;
    public static final int COST_VK=213;
    public static final int COUNT_VK=214;
    public static final int CROSS_VK=215;
    public static final int CUBE_VK=216;
    public static final int CURRENT_USER_VK=217;
    public static final int CURRENT_VK=218;
    public static final int CURSOR_NAME=219;
    public static final int CUSTOMDATUM_VK=220;
    public static final int CUSTOM_TYPE=221;
    public static final int CYCLE_VK=222;
    public static final int C_VK=223;
    public static final int DATABASE_VK=224;
    public static final int DATETIME_OP=225;
    public static final int DATE_VK=226;
    public static final int DAY_VK=227;
    public static final int DBTIMEZONE_VK=228;
    public static final int DB_ROLE_CHANGE_VK=229;
    public static final int DDL_VK=230;
    public static final int DEBUG_VK=231;
    public static final int DECIMAL_VK=232;
    public static final int DECOMPOSE_VK=233;
    public static final int DECREMENT_VK=234;
    public static final int DEC_VK=235;
    public static final int DEFAULTS_VK=236;
    public static final int DEFERRED_VK=237;
    public static final int DEFINER_VK=238;
    public static final int DENSE_RANK_VK=240;
    public static final int DETERMINISTIC_VK=241;
    public static final int DIMENSION_VK=242;
    public static final int DIRECT_MODE=243;
    public static final int DISABLE_VK=244;
    public static final int DISASSOCIATE_VK=245;
    public static final int DML_STATEMENT=246;
    public static final int DOCUMENT_VK=247;
    public static final int DOT_ASTERISK=248;
    public static final int DOUBLE_VK=249;
    public static final int DSINTERVAL_UNCONSTRAINED_VK=250;
    public static final int ELEMENT=251;
    public static final int ELEMENTS_MODE=252;
    public static final int ENABLE_VK=253;
    public static final int ENCODING_VK=254;
    public static final int ENTITYESCAPING_VK=255;
    public static final int EVALNAME_VK=257;
    public static final int EXCEPTIONS_VK=259;
    public static final int EXCEPTION_INIT_VK=260;
    public static final int EXCEPTION_NAME=261;
    public static final int EXCLUDE_VK=262;
    public static final int EXECUTE_VK=263;
    public static final int EXIT_VK=264;
    public static final int EXPR=265;
    public static final int EXPR_LIST=266;
    public static final int EXTERNAL_VK=267;
    public static final int EXTRACT_VK=268;
    public static final int FACTORING=269;
    public static final int FINAL_VK=270;
    public static final int FIRST_VALUE_VK=271;
    public static final int FIRST_VK=272;
    public static final int FLOAT_VK=273;
    public static final int FOLLOWING_VK=274;
    public static final int FOLLOWS_VK=275;
    public static final int FORALL_VK=276;
    public static final int FORCE_VK=277;
    public static final int FOR_MULTI_COLUMN=278;
    public static final int FOR_SINGLE_COLUMN=279;
    public static final int FULL_VK=280;
    public static final int FUNCTION_ENABLING_OVER=281;
    public static final int FUNCTION_ENABLING_USING=282;
    public static final int FUNCTION_ENABLING_WITHIN_OR_OVER=283;
    public static final int FUNCTION_NAME=284;
    public static final int GROUPING_VK=287;
    public static final int GROUPIN_SET=288;
    public static final int GROUP_BY_ELEMENT=289;
    public static final int HASH_VK=290;
    public static final int HIDE_VK=291;
    public static final int HIERARCHICAL=292;
    public static final int HOSTED_VARIABLE=293;
    public static final int HOSTED_VARIABLE_NAME=294;
    public static final int HOSTED_VARIABLE_ROUTINE_CALL=295;
    public static final int HOUR_VK=296;
    public static final int ID=297;
    public static final int IGNORE_VK=298;
    public static final int IMMEDIATE_VK=299;
    public static final int IMPLEMENTATION_TYPE_NAME=300;
    public static final int INCLUDE_VK=301;
    public static final int INCLUDING_VK=302;
    public static final int INCREMENT_VK=303;
    public static final int INDENT_VK=304;
    public static final int INDEX_NAME=305;
    public static final int INLINE_VK=306;
    public static final int INNER_VK=307;
    public static final int INOUT_VK=308;
    public static final int INSERT_STATEMENT=309;
    public static final int INSTANTIABLE_VK=310;
    public static final int INSTEAD_VK=311;
    public static final int INTEGER_VK=312;
    public static final int INTERVAL_DATATYPE=313;
    public static final int INT_VK=315;
    public static final int INVALIDATE_VK=316;
    public static final int ISOLATION_VK=317;
    public static final int IS_A_SET=318;
    public static final int IS_EMPTY=319;
    public static final int IS_INFINITE=320;
    public static final int IS_NAN=321;
    public static final int IS_NOT_A_SET=322;
    public static final int IS_NOT_EMPTY=323;
    public static final int IS_NOT_INFINITE=324;
    public static final int IS_NOT_NAN=325;
    public static final int IS_NOT_NULL=326;
    public static final int IS_NOT_OF_TYPE=327;
    public static final int IS_NOT_PRESENT=328;
    public static final int IS_NULL=329;
    public static final int IS_OF_TYPE=330;
    public static final int IS_PRESENT=331;
    public static final int ITERATE_VK=332;
    public static final int JAVA_VK=333;
    public static final int JOIN_DEF=334;
    public static final int KEEP_VK=335;
    public static final int LABEL_NAME=336;
    public static final int LANGUAGE_VK=337;
    public static final int LAST_VALUE_VK=338;
    public static final int LAST_VK=339;
    public static final int LEADING_VK=340;
    public static final int LEFT_VK=343;
    public static final int LIBRARY_VK=346;
    public static final int LIKE2_VK=347;
    public static final int LIKE4_VK=348;
    public static final int LIKEC_VK=349;
    public static final int LIMIT_VK=350;
    public static final int LINK_NAME=351;
    public static final int LOCAL_VK=352;
    public static final int LOCK_TABLE_ELEMENT=353;
    public static final int LOGIC_EXPR=354;
    public static final int LOGOFF_VK=355;
    public static final int LOGON_VK=356;
    public static final int LOG_VK=357;
    public static final int LONG_VK=358;
    public static final int LOOP_VK=359;
    public static final int MAIN_MODEL=360;
    public static final int MAIN_MODEL_NAME=361;
    public static final int MAP_VK=362;
    public static final int MAXVALUE_VK=363;
    public static final int MEASURES_VK=364;
    public static final int MEMBER_VK=365;
    public static final int MERGE_INSERT=366;
    public static final int MERGE_UPDATE=367;
    public static final int MERGE_VK=368;
    public static final int MINUTE_VK=370;
    public static final int MINVALUE_VK=371;
    public static final int MLSLABEL_VK=372;
    public static final int MODEL_COLUMN=373;
    public static final int MODEL_COLUMNS=374;
    public static final int MODEL_EXPRESSION=375;
    public static final int MODEL_RULE=376;
    public static final int MODEL_RULES=377;
    public static final int MODIFY_VK=378;
    public static final int MONTH_VK=379;
    public static final int MULTI_TABLE_MODE=380;
    public static final int NAME_VK=381;
    public static final int NATIVE_DATATYPE=382;
    public static final int NATURALN_VK=383;
    public static final int NATURAL_VK=384;
    public static final int NAV_VK=385;
    public static final int NCHAR_CS_VK=386;
    public static final int NCHAR_VK=387;
    public static final int NCLOB_VK=388;
    public static final int NESTED_VK=389;
    public static final int NEW_VK=390;
    public static final int NOAUDIT_VK=391;
    public static final int NOCACHE_VK=392;
    public static final int NOCOPY_VK=393;
    public static final int NOCYCLE_VK=394;
    public static final int NOENTITYESCAPING_VK=395;
    public static final int NOMAXVALUE_VK=396;
    public static final int NOMINVALUE_VK=397;
    public static final int NOORDER_VK=398;
    public static final int NOSCHEMACHECK_VK=399;
    public static final int NOT_BETWEEN=400;
    public static final int NOT_IN=402;
    public static final int NOT_LIKE=403;
    public static final int NO_VK=404;
    public static final int NULLS_VK=405;
    public static final int NUMBER_VK=406;
    public static final int NUMERIC_VK=407;
    public static final int NVARCHAR2_VK=408;
    public static final int OBJECT_VK=409;
    public static final int OFF_VK=410;
    public static final int OLD_VK=411;
    public static final int ONLY_VK=412;
    public static final int OPEN_VK=413;
    public static final int ORADATA_VK=414;
    public static final int ORDER_BY_ELEMENT=415;
    public static final int ORDER_BY_ELEMENTS=416;
    public static final int ORDINALITY_VK=417;
    public static final int OUT_VK=418;
    public static final int OVERRIDING_VK=419;
    public static final int OVER_VK=420;
    public static final int PACKAGE_NAME=421;
    public static final int PACKAGE_VK=422;
    public static final int PARALLEL_ENABLE_VK=423;
    public static final int PARAMETERS_VK=424;
    public static final int PARAMETER_NAME=425;
    public static final int PARENT_VK=426;
    public static final int PARTITION_VK=427;
    public static final int PASSING_VK=428;
    public static final int PERCENT_FOUND_VK=430;
    public static final int PERCENT_ISOPEN_VK=431;
    public static final int PERCENT_NOTFOUND_VK=432;
    public static final int PERCENT_ROWCOUNT_VK=433;
    public static final int PERCENT_ROWTYPE_VK=434;
    public static final int PERCENT_TYPE_VK=435;
    public static final int PIPELINED_VK=437;
    public static final int PIVOT_ALIAS=438;
    public static final int PIVOT_ELEMENT=439;
    public static final int PIVOT_IN_ELEMENT=440;
    public static final int PIVOT_VK=441;
    public static final int PLS_INTEGER_VK=456;
    public static final int POSITIVEN_VK=458;
    public static final int POSITIVE_VK=459;
    public static final int PRAGMA_VK=460;
    public static final int PRECEDING_VK=461;
    public static final int PRECISION=462;
    public static final int PRECISION_VK=463;
    public static final int PREDICTION_FUNCTION=464;
    public static final int PROCEDURE_NAME=465;
    public static final int QUERY_NAME=466;
    public static final int RAISE_VK=467;
    public static final int RANGE_VK=468;
    public static final int RAW_VK=469;
    public static final int READ_VK=470;
    public static final int REAL_VK=471;
    public static final int RECORD_NAME=472;
    public static final int REFERENCE_MODEL_NAME=473;
    public static final int REFERENCE_VK=474;
    public static final int REFERENCING_VK=475;
    public static final int REF_VK=476;
    public static final int REJECT_VK=478;
    public static final int RELIES_ON_VK=479;
    public static final int RENAME_VK=480;
    public static final int REPLACE_VK=481;
    public static final int RESTRICT_REFERENCES_VK=482;
    public static final int RESULT_CACHE_VK=483;
    public static final int RETURN_VK=484;
    public static final int REUSE_VK=485;
    public static final int REVERSE_VK=486;
    public static final int RIGHT_VK=489;
    public static final int ROLLBACK_SEGMENT_NAME=490;
    public static final int ROLLBACK_VK=491;
    public static final int ROLLUP_VK=492;
    public static final int ROUTINE_CALL=493;
    public static final int ROUTINE_NAME=494;
    public static final int ROWID_VK=495;
    public static final int ROWS_VK=496;
    public static final int ROW_VK=497;
    public static final int RULES_VK=498;
    public static final int SAMPLE_VK=499;
    public static final int SAVEPOINT_NAME=500;
    public static final int SAVEPOINT_VK=501;
    public static final int SCHEMACHECK_VK=502;
    public static final int SCHEMA_NAME=503;
    public static final int SCHEMA_VK=504;
    public static final int SCN_VK=505;
    public static final int SEARCHED_CASE=506;
    public static final int SECOND_VK=507;
    public static final int SEED_VK=508;
    public static final int SELECTED_TABLEVIEW=509;
    public static final int SELECT_ITEM=510;
    public static final int SELECT_LIST=511;
    public static final int SELECT_MODE=512;
    public static final int SELECT_STATEMENT=513;
    public static final int SELF_VK=514;
    public static final int SEQUENCE_NAME=515;
    public static final int SEQUENCE_VK=516;
    public static final int SEQUENTIAL_VK=517;
    public static final int SERIALIZABLE_VK=518;
    public static final int SERIALLY_REUSABLE_VK=519;
    public static final int SERVERERROR_VK=520;
    public static final int SESSIONTIMEZONE_VK=521;
    public static final int SET_VK=522;
    public static final int SHOW_VK=523;
    public static final int SHUTDOWN_VK=524;
    public static final int SIBLINGS_VK=525;
    public static final int SIGNTYPE_VK=526;
    public static final int SIMPLE_CASE=527;
    public static final int SIMPLE_INTEGER_VK=528;
    public static final int SINGLE_TABLE_MODE=529;
    public static final int SINGLE_VK=530;
    public static final int SKIP_VK=531;
    public static final int SMALLINT_VK=532;
    public static final int SOME_VK=534;
    public static final int SPECIFICATION_VK=535;
    public static final int SQLDATA_VK=597;
    public static final int STANDALONE_VK=598;
    public static final int STANDARD_FUNCTION=599;
    public static final int STARTUP_VK=600;
    public static final int STATIC_RETURNING=601;
    public static final int STATIC_VK=602;
    public static final int STATISTICS_VK=603;
    public static final int STRING_VK=604;
    public static final int SUBMULTISET_VK=605;
    public static final int SUBPARTITION_VK=606;
    public static final int SUBQUERY=607;
    public static final int SUSPEND_VK=608;
    public static final int TABLEVIEW_NAME=609;
    public static final int TABLE_ELEMENT=610;
    public static final int TABLE_EXPRESSION=611;
    public static final int TABLE_REF=612;
    public static final int TABLE_REF_ELEMENT=613;
    public static final int TABLE_VAR_NAME=614;
    public static final int TIMESTAMP_LTZ_UNCONSTRAINED_VK=615;
    public static final int TIMESTAMP_TZ_UNCONSTRAINED_VK=616;
    public static final int TIMESTAMP_UNCONSTRAINED_VK=617;
    public static final int TIMESTAMP_VK=618;
    public static final int TIMEZONE_ABBR_VK=619;
    public static final int TIMEZONE_HOUR_VK=620;
    public static final int TIMEZONE_MINUTE_VK=621;
    public static final int TIMEZONE_REGION_VK=622;
    public static final int TIME_VK=623;
    public static final int TRAILING_VK=624;
    public static final int TRANSLATE_VK=625;
    public static final int TREAT_VK=626;
    public static final int TRIGGER_NAME=627;
    public static final int TRIM_VK=628;
    public static final int TRUNCATE_VK=629;
    public static final int TYPE_NAME=630;
    public static final int TYPE_VK=631;
    public static final int UNARY_OPERATOR=632;
    public static final int UNBOUNDED_VK=633;
    public static final int UNDER_VK=634;
    public static final int UNLIMITED_VK=635;
    public static final int UNPIVOT_IN_ELEMENT=636;
    public static final int UNPIVOT_VK=637;
    public static final int UNTIL_VK=639;
    public static final int UPDATED_VK=640;
    public static final int UPSERT_VK=641;
    public static final int UROWID_VK=642;
    public static final int VALIDATE_VK=643;
    public static final int VALUE_VK=644;
    public static final int VARCHAR2_VK=645;
    public static final int VARCHAR_VK=646;
    public static final int VARIABLE_NAME=647;
    public static final int VECTOR_EXPR=648;
    public static final int VERSIONS_VK=649;
    public static final int VERSION_VK=650;
    public static final int WAIT_VK=651;
    public static final int WELLFORMED_VK=652;
    public static final int WITHIN_VK=653;
    public static final int WORK_VK=654;
    public static final int WRITE_VK=655;
    public static final int XMLAGG_VK=656;
    public static final int XMLATTRIBUTES_VK=657;
    public static final int XMLCAST_VK=658;
    public static final int XMLCOLATTVAL_VK=659;
    public static final int XMLELEMENT_VK=660;
    public static final int XMLEXISTS_VK=661;
    public static final int XMLFOREST_VK=662;
    public static final int XMLNAMESPACES_VK=663;
    public static final int XMLPARSE_VK=664;
    public static final int XMLPI_VK=665;
    public static final int XMLQUERY_VK=666;
    public static final int XMLROOT_VK=667;
    public static final int XMLSERIALIZE_VK=668;
    public static final int XMLTABLE_VK=669;
    public static final int XML_ALIAS=670;
    public static final int XML_COLUMN=671;
    public static final int XML_COLUMN_NAME=672;
    public static final int XML_ELEMENT=673;
    public static final int XML_VK=674;
    public static final int YEAR_VK=675;
    public static final int YES_VK=676;
    public static final int YMINTERVAL_UNCONSTRAINED_VK=677;

    // delegates
    public Parser[] getDelegates() {
        return new Parser[] {};
    }

    // delegators
    public PLSQLParser gPLSQLParser;
    public PLSQLParser gParent;


    public PLSQLParser_PLSQL_DMLParser(TokenStream input, PLSQLParser gPLSQLParser) {
        this(input, new RecognizerSharedState(), gPLSQLParser);
    }
    public PLSQLParser_PLSQL_DMLParser(TokenStream input, RecognizerSharedState state, PLSQLParser gPLSQLParser) {
        super(input, state);
        this.gPLSQLParser = gPLSQLParser;
        gParent = gPLSQLParser;
    }

protected TreeAdaptor adaptor = new CommonTreeAdaptor();

public void setTreeAdaptor(TreeAdaptor adaptor) {
    this.adaptor = adaptor;
}
public TreeAdaptor getTreeAdaptor() {
    return adaptor;
}
    public String[] getTokenNames() { return PLSQLParser.tokenNames; }
    public String getGrammarFileName() { return "PLSQL_DMLParser.g"; }


        private boolean isTableAlias() {
            String lt1 = input.LT(1).getText().toLowerCase();
            String lt2 = "";
            if (input.LT(2).getText() != null){
                lt2 = input.LT(2).getText().toLowerCase();
            }

            if (lt1.equals("as")){
                return true;
            }

            if ((lt1.equals("partition") && lt2.equals("by")) || lt1.equals("cross")
                    || lt1.equals("natural") || lt1.equals("inner")
                    || lt1.equals("join")
                    || ((lt1.equals("full") || lt1.equals("left") || lt1.equals("right")) && (lt2.equals("outer") || lt2.equals("join")))) {
                return false;
            }
            return true;
        }

        private boolean isStandardPredictionFunction(String originalFunctionName) {
            String functionName = originalFunctionName.toLowerCase();
            if (functionName.equals("prediction")
                    || functionName.equals("prediction_bounds")
                    || functionName.equals("prediction_cost")
                    || functionName.equals("prediction_details")
                    || functionName.equals("prediction_probability")
                    || functionName.equals("prediction_set")) {
                return true;
            }
            return false;
        }

        private boolean enablesWithinOrOverClause(String originalFunctionName) {
            String functionName = originalFunctionName.toLowerCase();
            if (functionName.equals("cume_dist")
                    || functionName.equals("dense_rank")
                    || functionName.equals("percent_rank")
                    || functionName.equals("percentile_cont")
                    || functionName.equals("percentile_disc")
                    || functionName.equals("rank")) {
                return true;
            }
            return false;
        }

        private boolean enablesUsingClause(String originalFunctionName) {
            String functionName = originalFunctionName.toLowerCase();
            if (functionName.startsWith("cluster_")
                    || functionName.startsWith("feature_")) {
                return true;
            }
            return false;
        }

        private boolean enablesOverClause(String originalFunctionName) {
            String functionName = originalFunctionName.toLowerCase();
            if (functionName.equals("avg") || functionName.equals("corr")
                    || functionName.equals("lag") || functionName.equals("lead")
                    || functionName.equals("max") || functionName.equals("median")
                    || functionName.equals("min") || functionName.equals("ntile")
                    || functionName.equals("ratio_to_report")
                    || functionName.equals("row_number")
                    || functionName.equals("sum")
                    || functionName.equals("variance")
                    || functionName.startsWith("regr_")
                    || functionName.startsWith("stddev")
                    || functionName.startsWith("var_")
                    || functionName.startsWith("covar_")) {
                return true;
            }
            return false;
        }
        
        public static class DmlStatement extends CommonTree
    	{
    		DmlStatement(int tokenType)
    		{
    			token = (Token) new CommonToken(tokenType, "");
    		}
    	}


    public static class compilation_unit_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "compilation_unit"
    // PLSQL_DMLParser.g:173:1: compilation_unit : ( seq_of_statements )* EOF ;
    public final PLSQLParser_PLSQL_DMLParser.compilation_unit_return compilation_unit() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.compilation_unit_return retval = new PLSQLParser_PLSQL_DMLParser.compilation_unit_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token EOF2=null;
        PLSQLParser_PLSQL_DMLParser.seq_of_statements_return seq_of_statements1 =null;


        Object EOF2_tree=null;

        try {
            // PLSQL_DMLParser.g:174:5: ( ( seq_of_statements )* EOF )
            // PLSQL_DMLParser.g:174:11: ( seq_of_statements )* EOF
            {
            root_0 = (Object)adaptor.nil();


            // PLSQL_DMLParser.g:174:11: ( seq_of_statements )*
            loop1:
            do {
                int alt1=2;
                int LA1_0 = input.LA(1);

                if ( (LA1_0==DELIMITED_ID||LA1_0==LEFT_PAREN||LA1_0==REGULAR_ID||LA1_0==SQL92_RESERVED_CASE||LA1_0==SQL92_RESERVED_DELETE||LA1_0==SQL92_RESERVED_INSERT||LA1_0==SQL92_RESERVED_SELECT||LA1_0==SQL92_RESERVED_UPDATE||LA1_0==SQL92_RESERVED_WITH) ) {
                    alt1=1;
                }


                switch (alt1) {
            	case 1 :
            	    // PLSQL_DMLParser.g:174:11: seq_of_statements
            	    {
            	    pushFollow(FOLLOW_seq_of_statements_in_compilation_unit585);
            	    seq_of_statements1=seq_of_statements();

            	    state._fsp--;
            	    if (state.failed) return retval;
            	    if ( state.backtracking==0 ) adaptor.addChild(root_0, seq_of_statements1.getTree());

            	    }
            	    break;

            	default :
            	    break loop1;
                }
            } while (true);


            EOF2=(Token)match(input,EOF,FOLLOW_EOF_in_compilation_unit588); if (state.failed) return retval;
            if ( state.backtracking==0 ) {
            EOF2_tree = 
            (Object)adaptor.create(EOF2)
            ;
            adaptor.addChild(root_0, EOF2_tree);
            }

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "compilation_unit"


    public static class seq_of_statements_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "seq_of_statements"
    // PLSQL_DMLParser.g:178:1: seq_of_statements : ( select_statement | update_statement | delete_statement | insert_statement | merge_statement | case_statement[true] );
    public final PLSQLParser_PLSQL_DMLParser.seq_of_statements_return seq_of_statements() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.seq_of_statements_return retval = new PLSQLParser_PLSQL_DMLParser.seq_of_statements_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        PLSQLParser_PLSQL_DMLParser.select_statement_return select_statement3 =null;

        PLSQLParser_PLSQL_DMLParser.update_statement_return update_statement4 =null;

        PLSQLParser_PLSQL_DMLParser.delete_statement_return delete_statement5 =null;

        PLSQLParser_PLSQL_DMLParser.insert_statement_return insert_statement6 =null;

        PLSQLParser_PLSQL_DMLParser.merge_statement_return merge_statement7 =null;

        PLSQLParser_PLSQL_DMLParser.case_statement_return case_statement8 =null;



        try {
            // PLSQL_DMLParser.g:179:5: ( select_statement | update_statement | delete_statement | insert_statement | merge_statement | case_statement[true] )
            int alt2=6;
            switch ( input.LA(1) ) {
            case LEFT_PAREN:
            case SQL92_RESERVED_SELECT:
            case SQL92_RESERVED_WITH:
                {
                alt2=1;
                }
                break;
            case SQL92_RESERVED_UPDATE:
                {
                alt2=2;
                }
                break;
            case SQL92_RESERVED_DELETE:
                {
                alt2=3;
                }
                break;
            case SQL92_RESERVED_INSERT:
                {
                alt2=4;
                }
                break;
            case REGULAR_ID:
                {
                int LA2_5 = input.LA(2);

                if ( (LA2_5==SQL92_RESERVED_INTO) && ((input.LT(1).getText().equalsIgnoreCase("merge")))) {
                    alt2=5;
                }
                else if ( (LA2_5==SQL92_RESERVED_CASE) ) {
                    alt2=6;
                }
                else {
                    if (state.backtracking>0) {state.failed=true; return retval;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 2, 5, input);

                    throw nvae;

                }
                }
                break;
            case DELIMITED_ID:
            case SQL92_RESERVED_CASE:
                {
                alt2=6;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return retval;}
                NoViableAltException nvae =
                    new NoViableAltException("", 2, 0, input);

                throw nvae;

            }

            switch (alt2) {
                case 1 :
                    // PLSQL_DMLParser.g:179:10: select_statement
                    {
                    root_0 = (Object)adaptor.nil();


                    pushFollow(FOLLOW_select_statement_in_seq_of_statements609);
                    select_statement3=select_statement();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, select_statement3.getTree());

                    }
                    break;
                case 2 :
                    // PLSQL_DMLParser.g:180:10: update_statement
                    {
                    root_0 = (Object)adaptor.nil();


                    pushFollow(FOLLOW_update_statement_in_seq_of_statements620);
                    update_statement4=update_statement();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, update_statement4.getTree());

                    }
                    break;
                case 3 :
                    // PLSQL_DMLParser.g:181:10: delete_statement
                    {
                    root_0 = (Object)adaptor.nil();


                    pushFollow(FOLLOW_delete_statement_in_seq_of_statements631);
                    delete_statement5=delete_statement();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, delete_statement5.getTree());

                    }
                    break;
                case 4 :
                    // PLSQL_DMLParser.g:182:10: insert_statement
                    {
                    root_0 = (Object)adaptor.nil();


                    pushFollow(FOLLOW_insert_statement_in_seq_of_statements642);
                    insert_statement6=insert_statement();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, insert_statement6.getTree());

                    }
                    break;
                case 5 :
                    // PLSQL_DMLParser.g:183:10: merge_statement
                    {
                    root_0 = (Object)adaptor.nil();


                    pushFollow(FOLLOW_merge_statement_in_seq_of_statements653);
                    merge_statement7=merge_statement();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, merge_statement7.getTree());

                    }
                    break;
                case 6 :
                    // PLSQL_DMLParser.g:184:10: case_statement[true]
                    {
                    root_0 = (Object)adaptor.nil();


                    pushFollow(FOLLOW_case_statement_in_seq_of_statements664);
                    case_statement8=case_statement(true);

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, case_statement8.getTree());

                    }
                    break;

            }
            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "seq_of_statements"


    public static class select_statement_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "select_statement"
    // PLSQL_DMLParser.g:187:1: select_statement : ( subquery_factoring_clause )? subquery ( for_update_clause | ( order_key ( siblings_key )? by_key )=> order_by_clause )* -> ^( SELECT_STATEMENT ( subquery_factoring_clause )? subquery ( for_update_clause )* ( order_by_clause )* ) ;
    public final PLSQLParser_PLSQL_DMLParser.select_statement_return select_statement() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.select_statement_return retval = new PLSQLParser_PLSQL_DMLParser.select_statement_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        PLSQLParser_PLSQL_DMLParser.subquery_factoring_clause_return subquery_factoring_clause9 =null;

        PLSQLParser_PLSQL_DMLParser.subquery_return subquery10 =null;

        PLSQLParser_PLSQL_DMLParser.for_update_clause_return for_update_clause11 =null;

        PLSQLParser_PLSQL_DMLParser.order_by_clause_return order_by_clause12 =null;


        RewriteRuleSubtreeStream stream_subquery_factoring_clause=new RewriteRuleSubtreeStream(adaptor,"rule subquery_factoring_clause");
        RewriteRuleSubtreeStream stream_order_by_clause=new RewriteRuleSubtreeStream(adaptor,"rule order_by_clause");
        RewriteRuleSubtreeStream stream_for_update_clause=new RewriteRuleSubtreeStream(adaptor,"rule for_update_clause");
        RewriteRuleSubtreeStream stream_subquery=new RewriteRuleSubtreeStream(adaptor,"rule subquery");
        try {
            // PLSQL_DMLParser.g:188:5: ( ( subquery_factoring_clause )? subquery ( for_update_clause | ( order_key ( siblings_key )? by_key )=> order_by_clause )* -> ^( SELECT_STATEMENT ( subquery_factoring_clause )? subquery ( for_update_clause )* ( order_by_clause )* ) )
            // PLSQL_DMLParser.g:188:10: ( subquery_factoring_clause )? subquery ( for_update_clause | ( order_key ( siblings_key )? by_key )=> order_by_clause )*
            {
            // PLSQL_DMLParser.g:188:10: ( subquery_factoring_clause )?
            int alt3=2;
            int LA3_0 = input.LA(1);

            if ( (LA3_0==SQL92_RESERVED_WITH) ) {
                alt3=1;
            }
            switch (alt3) {
                case 1 :
                    // PLSQL_DMLParser.g:188:10: subquery_factoring_clause
                    {
                    pushFollow(FOLLOW_subquery_factoring_clause_in_select_statement685);
                    subquery_factoring_clause9=subquery_factoring_clause();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_subquery_factoring_clause.add(subquery_factoring_clause9.getTree());

                    }
                    break;

            }


            pushFollow(FOLLOW_subquery_in_select_statement696);
            subquery10=subquery();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_subquery.add(subquery10.getTree());

            // PLSQL_DMLParser.g:190:9: ( for_update_clause | ( order_key ( siblings_key )? by_key )=> order_by_clause )*
            loop4:
            do {
                int alt4=3;
                int LA4_0 = input.LA(1);

                if ( (LA4_0==SQL92_RESERVED_FOR) ) {
                    alt4=1;
                }
                else if ( (LA4_0==SQL92_RESERVED_ORDER) && (synpred1_PLSQL_DMLParser())) {
                    alt4=2;
                }


                switch (alt4) {
            	case 1 :
            	    // PLSQL_DMLParser.g:190:10: for_update_clause
            	    {
            	    pushFollow(FOLLOW_for_update_clause_in_select_statement707);
            	    for_update_clause11=for_update_clause();

            	    state._fsp--;
            	    if (state.failed) return retval;
            	    if ( state.backtracking==0 ) stream_for_update_clause.add(for_update_clause11.getTree());

            	    }
            	    break;
            	case 2 :
            	    // PLSQL_DMLParser.g:190:28: ( order_key ( siblings_key )? by_key )=> order_by_clause
            	    {
            	    pushFollow(FOLLOW_order_by_clause_in_select_statement719);
            	    order_by_clause12=order_by_clause();

            	    state._fsp--;
            	    if (state.failed) return retval;
            	    if ( state.backtracking==0 ) stream_order_by_clause.add(order_by_clause12.getTree());

            	    }
            	    break;

            	default :
            	    break loop4;
                }
            } while (true);


            // AST REWRITE
            // elements: subquery_factoring_clause, subquery, order_by_clause, for_update_clause
            // token labels: 
            // rule labels: retval
            // token list labels: 
            // rule list labels: 
            // wildcard labels: 
            if ( state.backtracking==0 ) {

            retval.tree = root_0;
            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

            root_0 = (Object)adaptor.nil();
            // 191:9: -> ^( SELECT_STATEMENT ( subquery_factoring_clause )? subquery ( for_update_clause )* ( order_by_clause )* )
            {
                // PLSQL_DMLParser.g:191:12: ^( SELECT_STATEMENT ( subquery_factoring_clause )? subquery ( for_update_clause )* ( order_by_clause )* )
                {
                Object root_1 = (Object)adaptor.nil();
                root_1 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(SELECT_STATEMENT, "SELECT_STATEMENT")
                , root_1);

                // PLSQL_DMLParser.g:191:31: ( subquery_factoring_clause )?
                if ( stream_subquery_factoring_clause.hasNext() ) {
                    adaptor.addChild(root_1, stream_subquery_factoring_clause.nextTree());

                }
                stream_subquery_factoring_clause.reset();

                adaptor.addChild(root_1, stream_subquery.nextTree());

                // PLSQL_DMLParser.g:191:67: ( for_update_clause )*
                while ( stream_for_update_clause.hasNext() ) {
                    adaptor.addChild(root_1, stream_for_update_clause.nextTree());

                }
                stream_for_update_clause.reset();

                // PLSQL_DMLParser.g:191:86: ( order_by_clause )*
                while ( stream_order_by_clause.hasNext() ) {
                    adaptor.addChild(root_1, stream_order_by_clause.nextTree());

                }
                stream_order_by_clause.reset();

                adaptor.addChild(root_0, root_1);
                }

            }


            retval.tree = root_0;
            }

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "select_statement"


    public static class subquery_factoring_clause_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "subquery_factoring_clause"
    // PLSQL_DMLParser.g:195:1: subquery_factoring_clause : with_key ^ factoring_element ( COMMA ! factoring_element )* ;
    public final PLSQLParser_PLSQL_DMLParser.subquery_factoring_clause_return subquery_factoring_clause() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.subquery_factoring_clause_return retval = new PLSQLParser_PLSQL_DMLParser.subquery_factoring_clause_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token COMMA15=null;
        PLSQLParser_PLSQLKeys.with_key_return with_key13 =null;

        PLSQLParser_PLSQL_DMLParser.factoring_element_return factoring_element14 =null;

        PLSQLParser_PLSQL_DMLParser.factoring_element_return factoring_element16 =null;


        Object COMMA15_tree=null;

        try {
            // PLSQL_DMLParser.g:196:5: ( with_key ^ factoring_element ( COMMA ! factoring_element )* )
            // PLSQL_DMLParser.g:196:10: with_key ^ factoring_element ( COMMA ! factoring_element )*
            {
            root_0 = (Object)adaptor.nil();


            pushFollow(FOLLOW_with_key_in_subquery_factoring_clause769);
            with_key13=gPLSQLParser.with_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) root_0 = (Object)adaptor.becomeRoot(with_key13.getTree(), root_0);

            pushFollow(FOLLOW_factoring_element_in_subquery_factoring_clause772);
            factoring_element14=factoring_element();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) adaptor.addChild(root_0, factoring_element14.getTree());

            // PLSQL_DMLParser.g:196:38: ( COMMA ! factoring_element )*
            loop5:
            do {
                int alt5=2;
                int LA5_0 = input.LA(1);

                if ( (LA5_0==COMMA) ) {
                    alt5=1;
                }


                switch (alt5) {
            	case 1 :
            	    // PLSQL_DMLParser.g:196:39: COMMA ! factoring_element
            	    {
            	    COMMA15=(Token)match(input,COMMA,FOLLOW_COMMA_in_subquery_factoring_clause775); if (state.failed) return retval;

            	    pushFollow(FOLLOW_factoring_element_in_subquery_factoring_clause778);
            	    factoring_element16=factoring_element();

            	    state._fsp--;
            	    if (state.failed) return retval;
            	    if ( state.backtracking==0 ) adaptor.addChild(root_0, factoring_element16.getTree());

            	    }
            	    break;

            	default :
            	    break loop5;
                }
            } while (true);


            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "subquery_factoring_clause"


    public static class factoring_element_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "factoring_element"
    // PLSQL_DMLParser.g:199:1: factoring_element : query_name as_key LEFT_PAREN subquery RIGHT_PAREN -> ^( FACTORING query_name subquery ) ;
    public final PLSQLParser_PLSQL_DMLParser.factoring_element_return factoring_element() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.factoring_element_return retval = new PLSQLParser_PLSQL_DMLParser.factoring_element_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token LEFT_PAREN19=null;
        Token RIGHT_PAREN21=null;
        PLSQLParser_PLSQLCommons.query_name_return query_name17 =null;

        PLSQLParser_PLSQLKeys.as_key_return as_key18 =null;

        PLSQLParser_PLSQL_DMLParser.subquery_return subquery20 =null;


        Object LEFT_PAREN19_tree=null;
        Object RIGHT_PAREN21_tree=null;
        RewriteRuleTokenStream stream_LEFT_PAREN=new RewriteRuleTokenStream(adaptor,"token LEFT_PAREN");
        RewriteRuleTokenStream stream_RIGHT_PAREN=new RewriteRuleTokenStream(adaptor,"token RIGHT_PAREN");
        RewriteRuleSubtreeStream stream_as_key=new RewriteRuleSubtreeStream(adaptor,"rule as_key");
        RewriteRuleSubtreeStream stream_query_name=new RewriteRuleSubtreeStream(adaptor,"rule query_name");
        RewriteRuleSubtreeStream stream_subquery=new RewriteRuleSubtreeStream(adaptor,"rule subquery");
        try {
            // PLSQL_DMLParser.g:200:5: ( query_name as_key LEFT_PAREN subquery RIGHT_PAREN -> ^( FACTORING query_name subquery ) )
            // PLSQL_DMLParser.g:200:10: query_name as_key LEFT_PAREN subquery RIGHT_PAREN
            {
            pushFollow(FOLLOW_query_name_in_factoring_element800);
            query_name17=gPLSQLParser.query_name();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_query_name.add(query_name17.getTree());

            pushFollow(FOLLOW_as_key_in_factoring_element802);
            as_key18=gPLSQLParser.as_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_as_key.add(as_key18.getTree());

            LEFT_PAREN19=(Token)match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_factoring_element804); if (state.failed) return retval; 
            if ( state.backtracking==0 ) stream_LEFT_PAREN.add(LEFT_PAREN19);


            pushFollow(FOLLOW_subquery_in_factoring_element806);
            subquery20=subquery();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_subquery.add(subquery20.getTree());

            RIGHT_PAREN21=(Token)match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_factoring_element808); if (state.failed) return retval; 
            if ( state.backtracking==0 ) stream_RIGHT_PAREN.add(RIGHT_PAREN21);


            // AST REWRITE
            // elements: query_name, subquery
            // token labels: 
            // rule labels: retval
            // token list labels: 
            // rule list labels: 
            // wildcard labels: 
            if ( state.backtracking==0 ) {

            retval.tree = root_0;
            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

            root_0 = (Object)adaptor.nil();
            // 201:9: -> ^( FACTORING query_name subquery )
            {
                // PLSQL_DMLParser.g:201:12: ^( FACTORING query_name subquery )
                {
                Object root_1 = (Object)adaptor.nil();
                root_1 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(FACTORING, "FACTORING")
                , root_1);

                adaptor.addChild(root_1, stream_query_name.nextTree());

                adaptor.addChild(root_1, stream_subquery.nextTree());

                adaptor.addChild(root_0, root_1);
                }

            }


            retval.tree = root_0;
            }

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "factoring_element"


    public static class subquery_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "subquery"
    // PLSQL_DMLParser.g:204:1: subquery : subquery_basic_elements ( subquery_operation_part )* -> ^( SUBQUERY subquery_basic_elements ( subquery_operation_part )* ) ;
    public final PLSQLParser_PLSQL_DMLParser.subquery_return subquery() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.subquery_return retval = new PLSQLParser_PLSQL_DMLParser.subquery_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        PLSQLParser_PLSQL_DMLParser.subquery_basic_elements_return subquery_basic_elements22 =null;

        PLSQLParser_PLSQL_DMLParser.subquery_operation_part_return subquery_operation_part23 =null;


        RewriteRuleSubtreeStream stream_subquery_operation_part=new RewriteRuleSubtreeStream(adaptor,"rule subquery_operation_part");
        RewriteRuleSubtreeStream stream_subquery_basic_elements=new RewriteRuleSubtreeStream(adaptor,"rule subquery_basic_elements");
        try {
            // PLSQL_DMLParser.g:205:5: ( subquery_basic_elements ( subquery_operation_part )* -> ^( SUBQUERY subquery_basic_elements ( subquery_operation_part )* ) )
            // PLSQL_DMLParser.g:205:10: subquery_basic_elements ( subquery_operation_part )*
            {
            pushFollow(FOLLOW_subquery_basic_elements_in_subquery846);
            subquery_basic_elements22=subquery_basic_elements();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_subquery_basic_elements.add(subquery_basic_elements22.getTree());

            // PLSQL_DMLParser.g:205:34: ( subquery_operation_part )*
            loop6:
            do {
                int alt6=2;
                int LA6_0 = input.LA(1);

                if ( (LA6_0==PLSQL_RESERVED_MINUS||LA6_0==SQL92_RESERVED_INTERSECT||LA6_0==SQL92_RESERVED_UNION) ) {
                    alt6=1;
                }


                switch (alt6) {
            	case 1 :
            	    // PLSQL_DMLParser.g:205:34: subquery_operation_part
            	    {
            	    pushFollow(FOLLOW_subquery_operation_part_in_subquery848);
            	    subquery_operation_part23=subquery_operation_part();

            	    state._fsp--;
            	    if (state.failed) return retval;
            	    if ( state.backtracking==0 ) stream_subquery_operation_part.add(subquery_operation_part23.getTree());

            	    }
            	    break;

            	default :
            	    break loop6;
                }
            } while (true);


            // AST REWRITE
            // elements: subquery_operation_part, subquery_basic_elements
            // token labels: 
            // rule labels: retval
            // token list labels: 
            // rule list labels: 
            // wildcard labels: 
            if ( state.backtracking==0 ) {

            retval.tree = root_0;
            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

            root_0 = (Object)adaptor.nil();
            // 206:9: -> ^( SUBQUERY subquery_basic_elements ( subquery_operation_part )* )
            {
                // PLSQL_DMLParser.g:206:12: ^( SUBQUERY subquery_basic_elements ( subquery_operation_part )* )
                {
                Object root_1 = (Object)adaptor.nil();
                root_1 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(SUBQUERY, "SUBQUERY")
                , root_1);

                adaptor.addChild(root_1, stream_subquery_basic_elements.nextTree());

                // PLSQL_DMLParser.g:206:47: ( subquery_operation_part )*
                while ( stream_subquery_operation_part.hasNext() ) {
                    adaptor.addChild(root_1, stream_subquery_operation_part.nextTree());

                }
                stream_subquery_operation_part.reset();

                adaptor.addChild(root_0, root_1);
                }

            }


            retval.tree = root_0;
            }

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "subquery"


    public static class subquery_operation_part_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "subquery_operation_part"
    // PLSQL_DMLParser.g:209:1: subquery_operation_part : ( union_key ^ ( all_key )? | intersect_key ^| minus_key ^) subquery_basic_elements ;
    public final PLSQLParser_PLSQL_DMLParser.subquery_operation_part_return subquery_operation_part() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.subquery_operation_part_return retval = new PLSQLParser_PLSQL_DMLParser.subquery_operation_part_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        PLSQLParser_PLSQLKeys.union_key_return union_key24 =null;

        PLSQLParser_PLSQLKeys.all_key_return all_key25 =null;

        PLSQLParser_PLSQLKeys.intersect_key_return intersect_key26 =null;

        PLSQLParser_PLSQLKeys.minus_key_return minus_key27 =null;

        PLSQLParser_PLSQL_DMLParser.subquery_basic_elements_return subquery_basic_elements28 =null;



        try {
            // PLSQL_DMLParser.g:210:5: ( ( union_key ^ ( all_key )? | intersect_key ^| minus_key ^) subquery_basic_elements )
            // PLSQL_DMLParser.g:210:10: ( union_key ^ ( all_key )? | intersect_key ^| minus_key ^) subquery_basic_elements
            {
            root_0 = (Object)adaptor.nil();


            // PLSQL_DMLParser.g:210:10: ( union_key ^ ( all_key )? | intersect_key ^| minus_key ^)
            int alt8=3;
            switch ( input.LA(1) ) {
            case SQL92_RESERVED_UNION:
                {
                alt8=1;
                }
                break;
            case SQL92_RESERVED_INTERSECT:
                {
                alt8=2;
                }
                break;
            case PLSQL_RESERVED_MINUS:
                {
                alt8=3;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return retval;}
                NoViableAltException nvae =
                    new NoViableAltException("", 8, 0, input);

                throw nvae;

            }

            switch (alt8) {
                case 1 :
                    // PLSQL_DMLParser.g:210:11: union_key ^ ( all_key )?
                    {
                    pushFollow(FOLLOW_union_key_in_subquery_operation_part889);
                    union_key24=gPLSQLParser.union_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) root_0 = (Object)adaptor.becomeRoot(union_key24.getTree(), root_0);

                    // PLSQL_DMLParser.g:210:22: ( all_key )?
                    int alt7=2;
                    int LA7_0 = input.LA(1);

                    if ( (LA7_0==SQL92_RESERVED_ALL) ) {
                        alt7=1;
                    }
                    switch (alt7) {
                        case 1 :
                            // PLSQL_DMLParser.g:210:22: all_key
                            {
                            pushFollow(FOLLOW_all_key_in_subquery_operation_part892);
                            all_key25=gPLSQLParser.all_key();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) adaptor.addChild(root_0, all_key25.getTree());

                            }
                            break;

                    }


                    }
                    break;
                case 2 :
                    // PLSQL_DMLParser.g:210:31: intersect_key ^
                    {
                    pushFollow(FOLLOW_intersect_key_in_subquery_operation_part895);
                    intersect_key26=gPLSQLParser.intersect_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) root_0 = (Object)adaptor.becomeRoot(intersect_key26.getTree(), root_0);

                    }
                    break;
                case 3 :
                    // PLSQL_DMLParser.g:210:46: minus_key ^
                    {
                    pushFollow(FOLLOW_minus_key_in_subquery_operation_part898);
                    minus_key27=gPLSQLParser.minus_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) root_0 = (Object)adaptor.becomeRoot(minus_key27.getTree(), root_0);

                    }
                    break;

            }


            pushFollow(FOLLOW_subquery_basic_elements_in_subquery_operation_part902);
            subquery_basic_elements28=subquery_basic_elements();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) adaptor.addChild(root_0, subquery_basic_elements28.getTree());

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "subquery_operation_part"


    public static class subquery_basic_elements_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "subquery_basic_elements"
    // PLSQL_DMLParser.g:213:1: subquery_basic_elements : ( query_block | LEFT_PAREN ! subquery RIGHT_PAREN !);
    public final PLSQLParser_PLSQL_DMLParser.subquery_basic_elements_return subquery_basic_elements() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.subquery_basic_elements_return retval = new PLSQLParser_PLSQL_DMLParser.subquery_basic_elements_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token LEFT_PAREN30=null;
        Token RIGHT_PAREN32=null;
        PLSQLParser_PLSQL_DMLParser.query_block_return query_block29 =null;

        PLSQLParser_PLSQL_DMLParser.subquery_return subquery31 =null;


        Object LEFT_PAREN30_tree=null;
        Object RIGHT_PAREN32_tree=null;

        try {
            // PLSQL_DMLParser.g:214:5: ( query_block | LEFT_PAREN ! subquery RIGHT_PAREN !)
            int alt9=2;
            int LA9_0 = input.LA(1);

            if ( (LA9_0==SQL92_RESERVED_SELECT) ) {
                alt9=1;
            }
            else if ( (LA9_0==LEFT_PAREN) ) {
                alt9=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return retval;}
                NoViableAltException nvae =
                    new NoViableAltException("", 9, 0, input);

                throw nvae;

            }
            switch (alt9) {
                case 1 :
                    // PLSQL_DMLParser.g:214:10: query_block
                    {
                    root_0 = (Object)adaptor.nil();


                    pushFollow(FOLLOW_query_block_in_subquery_basic_elements922);
                    query_block29=query_block();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, query_block29.getTree());

                    }
                    break;
                case 2 :
                    // PLSQL_DMLParser.g:215:10: LEFT_PAREN ! subquery RIGHT_PAREN !
                    {
                    root_0 = (Object)adaptor.nil();


                    LEFT_PAREN30=(Token)match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_subquery_basic_elements933); if (state.failed) return retval;

                    pushFollow(FOLLOW_subquery_in_subquery_basic_elements936);
                    subquery31=subquery();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, subquery31.getTree());

                    RIGHT_PAREN32=(Token)match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_subquery_basic_elements938); if (state.failed) return retval;

                    }
                    break;

            }
            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "subquery_basic_elements"


    public static class query_block_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "query_block"
    // PLSQL_DMLParser.g:218:1: query_block : select_key ( ( distinct_key | unique_key | all_key )=> ( distinct_key | unique_key | all_key ) )? ( ASTERISK | selected_element ( COMMA selected_element )* ) ( into_clause )? from_clause ( where_clause )? ( hierarchical_query_clause )? ( group_by_clause )? ( having_clause )? ( model_clause )? -> {mode == 1}? ^( select_key from_clause ( distinct_key )? ( unique_key )? ( all_key )? ASTERISK ( into_clause )? ( where_clause )? ( hierarchical_query_clause )? ( group_by_clause )? ( having_clause )? ( model_clause )? ) -> ^( select_key from_clause ( distinct_key )? ( unique_key )? ( all_key )? ^( SELECT_LIST ( selected_element )+ ) ( into_clause )? ( where_clause )? ( hierarchical_query_clause )? ( group_by_clause )? ( having_clause )? ( model_clause )? ) ;
    public final PLSQLParser_PLSQL_DMLParser.query_block_return query_block() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.query_block_return retval = new PLSQLParser_PLSQL_DMLParser.query_block_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token ASTERISK37=null;
        Token COMMA39=null;
        PLSQLParser_PLSQLKeys.select_key_return select_key33 =null;

        PLSQLParser_PLSQLKeys.distinct_key_return distinct_key34 =null;

        PLSQLParser_PLSQLKeys.unique_key_return unique_key35 =null;

        PLSQLParser_PLSQLKeys.all_key_return all_key36 =null;

        PLSQLParser_PLSQL_DMLParser.selected_element_return selected_element38 =null;

        PLSQLParser_PLSQL_DMLParser.selected_element_return selected_element40 =null;

        PLSQLParser_PLSQLCommons.into_clause_return into_clause41 =null;

        PLSQLParser_PLSQL_DMLParser.from_clause_return from_clause42 =null;

        PLSQLParser_PLSQLCommons.where_clause_return where_clause43 =null;

        PLSQLParser_PLSQL_DMLParser.hierarchical_query_clause_return hierarchical_query_clause44 =null;

        PLSQLParser_PLSQL_DMLParser.group_by_clause_return group_by_clause45 =null;

        PLSQLParser_PLSQL_DMLParser.having_clause_return having_clause46 =null;

        PLSQLParser_PLSQL_DMLParser.model_clause_return model_clause47 =null;


        Object ASTERISK37_tree=null;
        Object COMMA39_tree=null;
        RewriteRuleTokenStream stream_COMMA=new RewriteRuleTokenStream(adaptor,"token COMMA");
        RewriteRuleTokenStream stream_ASTERISK=new RewriteRuleTokenStream(adaptor,"token ASTERISK");
        RewriteRuleSubtreeStream stream_all_key=new RewriteRuleSubtreeStream(adaptor,"rule all_key");
        RewriteRuleSubtreeStream stream_from_clause=new RewriteRuleSubtreeStream(adaptor,"rule from_clause");
        RewriteRuleSubtreeStream stream_having_clause=new RewriteRuleSubtreeStream(adaptor,"rule having_clause");
        RewriteRuleSubtreeStream stream_where_clause=new RewriteRuleSubtreeStream(adaptor,"rule where_clause");
        RewriteRuleSubtreeStream stream_into_clause=new RewriteRuleSubtreeStream(adaptor,"rule into_clause");
        RewriteRuleSubtreeStream stream_distinct_key=new RewriteRuleSubtreeStream(adaptor,"rule distinct_key");
        RewriteRuleSubtreeStream stream_group_by_clause=new RewriteRuleSubtreeStream(adaptor,"rule group_by_clause");
        RewriteRuleSubtreeStream stream_selected_element=new RewriteRuleSubtreeStream(adaptor,"rule selected_element");
        RewriteRuleSubtreeStream stream_unique_key=new RewriteRuleSubtreeStream(adaptor,"rule unique_key");
        RewriteRuleSubtreeStream stream_model_clause=new RewriteRuleSubtreeStream(adaptor,"rule model_clause");
        RewriteRuleSubtreeStream stream_select_key=new RewriteRuleSubtreeStream(adaptor,"rule select_key");
        RewriteRuleSubtreeStream stream_hierarchical_query_clause=new RewriteRuleSubtreeStream(adaptor,"rule hierarchical_query_clause");
            int mode = 0;    
        try {
            // PLSQL_DMLParser.g:220:5: ( select_key ( ( distinct_key | unique_key | all_key )=> ( distinct_key | unique_key | all_key ) )? ( ASTERISK | selected_element ( COMMA selected_element )* ) ( into_clause )? from_clause ( where_clause )? ( hierarchical_query_clause )? ( group_by_clause )? ( having_clause )? ( model_clause )? -> {mode == 1}? ^( select_key from_clause ( distinct_key )? ( unique_key )? ( all_key )? ASTERISK ( into_clause )? ( where_clause )? ( hierarchical_query_clause )? ( group_by_clause )? ( having_clause )? ( model_clause )? ) -> ^( select_key from_clause ( distinct_key )? ( unique_key )? ( all_key )? ^( SELECT_LIST ( selected_element )+ ) ( into_clause )? ( where_clause )? ( hierarchical_query_clause )? ( group_by_clause )? ( having_clause )? ( model_clause )? ) )
            // PLSQL_DMLParser.g:220:10: select_key ( ( distinct_key | unique_key | all_key )=> ( distinct_key | unique_key | all_key ) )? ( ASTERISK | selected_element ( COMMA selected_element )* ) ( into_clause )? from_clause ( where_clause )? ( hierarchical_query_clause )? ( group_by_clause )? ( having_clause )? ( model_clause )?
            {
            pushFollow(FOLLOW_select_key_in_query_block967);
            select_key33=gPLSQLParser.select_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_select_key.add(select_key33.getTree());

            // PLSQL_DMLParser.g:221:9: ( ( distinct_key | unique_key | all_key )=> ( distinct_key | unique_key | all_key ) )?
            int alt11=2;
            int LA11_0 = input.LA(1);

            if ( (LA11_0==SQL92_RESERVED_DISTINCT) ) {
                int LA11_1 = input.LA(2);

                if ( (synpred2_PLSQL_DMLParser()) ) {
                    alt11=1;
                }
            }
            else if ( (LA11_0==SQL92_RESERVED_UNIQUE) && (synpred2_PLSQL_DMLParser())) {
                alt11=1;
            }
            else if ( (LA11_0==SQL92_RESERVED_ALL) ) {
                int LA11_3 = input.LA(2);

                if ( (synpred2_PLSQL_DMLParser()) ) {
                    alt11=1;
                }
            }
            switch (alt11) {
                case 1 :
                    // PLSQL_DMLParser.g:221:10: ( distinct_key | unique_key | all_key )=> ( distinct_key | unique_key | all_key )
                    {
                    // PLSQL_DMLParser.g:221:46: ( distinct_key | unique_key | all_key )
                    int alt10=3;
                    switch ( input.LA(1) ) {
                    case SQL92_RESERVED_DISTINCT:
                        {
                        alt10=1;
                        }
                        break;
                    case SQL92_RESERVED_UNIQUE:
                        {
                        alt10=2;
                        }
                        break;
                    case SQL92_RESERVED_ALL:
                        {
                        alt10=3;
                        }
                        break;
                    default:
                        if (state.backtracking>0) {state.failed=true; return retval;}
                        NoViableAltException nvae =
                            new NoViableAltException("", 10, 0, input);

                        throw nvae;

                    }

                    switch (alt10) {
                        case 1 :
                            // PLSQL_DMLParser.g:221:47: distinct_key
                            {
                            pushFollow(FOLLOW_distinct_key_in_query_block988);
                            distinct_key34=gPLSQLParser.distinct_key();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) stream_distinct_key.add(distinct_key34.getTree());

                            }
                            break;
                        case 2 :
                            // PLSQL_DMLParser.g:221:60: unique_key
                            {
                            pushFollow(FOLLOW_unique_key_in_query_block990);
                            unique_key35=gPLSQLParser.unique_key();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) stream_unique_key.add(unique_key35.getTree());

                            }
                            break;
                        case 3 :
                            // PLSQL_DMLParser.g:221:71: all_key
                            {
                            pushFollow(FOLLOW_all_key_in_query_block992);
                            all_key36=gPLSQLParser.all_key();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) stream_all_key.add(all_key36.getTree());

                            }
                            break;

                    }


                    }
                    break;

            }


            // PLSQL_DMLParser.g:222:9: ( ASTERISK | selected_element ( COMMA selected_element )* )
            int alt13=2;
            int LA13_0 = input.LA(1);

            if ( (LA13_0==ASTERISK) ) {
                alt13=1;
            }
            else if ( (LA13_0==APPROXIMATE_NUM_LIT||(LA13_0 >= CHAR_STRING && LA13_0 <= COLON)||LA13_0==DELIMITED_ID||LA13_0==EXACT_NUM_LIT||LA13_0==INTRODUCER||LA13_0==LEFT_PAREN||LA13_0==MINUS_SIGN||LA13_0==PLUS_SIGN||LA13_0==REGULAR_ID||LA13_0==SQL92_RESERVED_ALL||LA13_0==SQL92_RESERVED_ANY||LA13_0==SQL92_RESERVED_CASE||LA13_0==SQL92_RESERVED_DEFAULT||LA13_0==SQL92_RESERVED_DISTINCT||(LA13_0 >= SQL92_RESERVED_EXISTS && LA13_0 <= SQL92_RESERVED_FALSE)||(LA13_0 >= SQL92_RESERVED_NOT && LA13_0 <= SQL92_RESERVED_NULL)||LA13_0==SQL92_RESERVED_PRIOR||LA13_0==SQL92_RESERVED_TRUE||LA13_0==UNSIGNED_INTEGER) ) {
                alt13=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return retval;}
                NoViableAltException nvae =
                    new NoViableAltException("", 13, 0, input);

                throw nvae;

            }
            switch (alt13) {
                case 1 :
                    // PLSQL_DMLParser.g:222:10: ASTERISK
                    {
                    ASTERISK37=(Token)match(input,ASTERISK,FOLLOW_ASTERISK_in_query_block1006); if (state.failed) return retval; 
                    if ( state.backtracking==0 ) stream_ASTERISK.add(ASTERISK37);


                    if ( state.backtracking==0 ) {mode = 1;}

                    }
                    break;
                case 2 :
                    // PLSQL_DMLParser.g:222:32: selected_element ( COMMA selected_element )*
                    {
                    pushFollow(FOLLOW_selected_element_in_query_block1011);
                    selected_element38=selected_element();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_selected_element.add(selected_element38.getTree());

                    // PLSQL_DMLParser.g:222:49: ( COMMA selected_element )*
                    loop12:
                    do {
                        int alt12=2;
                        int LA12_0 = input.LA(1);

                        if ( (LA12_0==COMMA) ) {
                            alt12=1;
                        }


                        switch (alt12) {
                    	case 1 :
                    	    // PLSQL_DMLParser.g:222:50: COMMA selected_element
                    	    {
                    	    COMMA39=(Token)match(input,COMMA,FOLLOW_COMMA_in_query_block1014); if (state.failed) return retval; 
                    	    if ( state.backtracking==0 ) stream_COMMA.add(COMMA39);


                    	    pushFollow(FOLLOW_selected_element_in_query_block1016);
                    	    selected_element40=selected_element();

                    	    state._fsp--;
                    	    if (state.failed) return retval;
                    	    if ( state.backtracking==0 ) stream_selected_element.add(selected_element40.getTree());

                    	    }
                    	    break;

                    	default :
                    	    break loop12;
                        }
                    } while (true);


                    }
                    break;

            }


            // PLSQL_DMLParser.g:223:9: ( into_clause )?
            int alt14=2;
            int LA14_0 = input.LA(1);

            if ( (LA14_0==SQL92_RESERVED_INTO) ) {
                alt14=1;
            }
            else if ( (LA14_0==REGULAR_ID) && ((input.LT(1).getText().equalsIgnoreCase("bulk")))) {
                alt14=1;
            }
            switch (alt14) {
                case 1 :
                    // PLSQL_DMLParser.g:223:9: into_clause
                    {
                    pushFollow(FOLLOW_into_clause_in_query_block1029);
                    into_clause41=gPLSQLParser.into_clause();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_into_clause.add(into_clause41.getTree());

                    }
                    break;

            }


            pushFollow(FOLLOW_from_clause_in_query_block1040);
            from_clause42=from_clause();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_from_clause.add(from_clause42.getTree());

            // PLSQL_DMLParser.g:225:9: ( where_clause )?
            int alt15=2;
            int LA15_0 = input.LA(1);

            if ( (LA15_0==SQL92_RESERVED_WHERE) ) {
                alt15=1;
            }
            switch (alt15) {
                case 1 :
                    // PLSQL_DMLParser.g:225:9: where_clause
                    {
                    pushFollow(FOLLOW_where_clause_in_query_block1051);
                    where_clause43=gPLSQLParser.where_clause();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_where_clause.add(where_clause43.getTree());

                    }
                    break;

            }


            // PLSQL_DMLParser.g:226:9: ( hierarchical_query_clause )?
            int alt16=2;
            int LA16_0 = input.LA(1);

            if ( (LA16_0==PLSQL_RESERVED_START||LA16_0==SQL92_RESERVED_CONNECT) ) {
                alt16=1;
            }
            switch (alt16) {
                case 1 :
                    // PLSQL_DMLParser.g:226:9: hierarchical_query_clause
                    {
                    pushFollow(FOLLOW_hierarchical_query_clause_in_query_block1063);
                    hierarchical_query_clause44=hierarchical_query_clause();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_hierarchical_query_clause.add(hierarchical_query_clause44.getTree());

                    }
                    break;

            }


            // PLSQL_DMLParser.g:227:9: ( group_by_clause )?
            int alt17=2;
            int LA17_0 = input.LA(1);

            if ( (LA17_0==SQL92_RESERVED_GROUP) ) {
                alt17=1;
            }
            switch (alt17) {
                case 1 :
                    // PLSQL_DMLParser.g:227:9: group_by_clause
                    {
                    pushFollow(FOLLOW_group_by_clause_in_query_block1075);
                    group_by_clause45=group_by_clause();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_group_by_clause.add(group_by_clause45.getTree());

                    }
                    break;

            }


            // PLSQL_DMLParser.g:228:9: ( having_clause )?
            int alt18=2;
            int LA18_0 = input.LA(1);

            if ( (LA18_0==SQL92_RESERVED_HAVING) ) {
                alt18=1;
            }
            switch (alt18) {
                case 1 :
                    // PLSQL_DMLParser.g:228:9: having_clause
                    {
                    pushFollow(FOLLOW_having_clause_in_query_block1086);
                    having_clause46=having_clause();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_having_clause.add(having_clause46.getTree());

                    }
                    break;

            }


            // PLSQL_DMLParser.g:229:9: ( model_clause )?
            int alt19=2;
            int LA19_0 = input.LA(1);

            if ( (LA19_0==PLSQL_NON_RESERVED_MODEL) ) {
                alt19=1;
            }
            switch (alt19) {
                case 1 :
                    // PLSQL_DMLParser.g:229:9: model_clause
                    {
                    pushFollow(FOLLOW_model_clause_in_query_block1098);
                    model_clause47=model_clause();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_model_clause.add(model_clause47.getTree());

                    }
                    break;

            }


            // AST REWRITE
            // elements: where_clause, group_by_clause, where_clause, unique_key, all_key, model_clause, ASTERISK, all_key, model_clause, hierarchical_query_clause, hierarchical_query_clause, group_by_clause, unique_key, selected_element, into_clause, having_clause, distinct_key, select_key, select_key, distinct_key, into_clause, having_clause, from_clause, from_clause
            // token labels: 
            // rule labels: retval
            // token list labels: 
            // rule list labels: 
            // wildcard labels: 
            if ( state.backtracking==0 ) {

            retval.tree = root_0;
            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

            root_0 = (Object)adaptor.nil();
            // 230:9: -> {mode == 1}? ^( select_key from_clause ( distinct_key )? ( unique_key )? ( all_key )? ASTERISK ( into_clause )? ( where_clause )? ( hierarchical_query_clause )? ( group_by_clause )? ( having_clause )? ( model_clause )? )
            if (mode == 1) {
                // PLSQL_DMLParser.g:230:25: ^( select_key from_clause ( distinct_key )? ( unique_key )? ( all_key )? ASTERISK ( into_clause )? ( where_clause )? ( hierarchical_query_clause )? ( group_by_clause )? ( having_clause )? ( model_clause )? )
                {
                Object root_1 = (Object)adaptor.nil();
                root_1 = (Object)adaptor.becomeRoot(stream_select_key.nextNode(), root_1);

                adaptor.addChild(root_1, stream_from_clause.nextTree());

                // PLSQL_DMLParser.g:230:50: ( distinct_key )?
                if ( stream_distinct_key.hasNext() ) {
                    adaptor.addChild(root_1, stream_distinct_key.nextTree());

                }
                stream_distinct_key.reset();

                // PLSQL_DMLParser.g:230:64: ( unique_key )?
                if ( stream_unique_key.hasNext() ) {
                    adaptor.addChild(root_1, stream_unique_key.nextTree());

                }
                stream_unique_key.reset();

                // PLSQL_DMLParser.g:230:76: ( all_key )?
                if ( stream_all_key.hasNext() ) {
                    adaptor.addChild(root_1, stream_all_key.nextTree());

                }
                stream_all_key.reset();

                adaptor.addChild(root_1, 
                stream_ASTERISK.nextNode()
                );

                // PLSQL_DMLParser.g:231:17: ( into_clause )?
                if ( stream_into_clause.hasNext() ) {
                    adaptor.addChild(root_1, stream_into_clause.nextTree());

                }
                stream_into_clause.reset();

                // PLSQL_DMLParser.g:231:30: ( where_clause )?
                if ( stream_where_clause.hasNext() ) {
                    adaptor.addChild(root_1, stream_where_clause.nextTree());

                }
                stream_where_clause.reset();

                // PLSQL_DMLParser.g:231:44: ( hierarchical_query_clause )?
                if ( stream_hierarchical_query_clause.hasNext() ) {
                    adaptor.addChild(root_1, stream_hierarchical_query_clause.nextTree());

                }
                stream_hierarchical_query_clause.reset();

                // PLSQL_DMLParser.g:231:71: ( group_by_clause )?
                if ( stream_group_by_clause.hasNext() ) {
                    adaptor.addChild(root_1, stream_group_by_clause.nextTree());

                }
                stream_group_by_clause.reset();

                // PLSQL_DMLParser.g:231:88: ( having_clause )?
                if ( stream_having_clause.hasNext() ) {
                    adaptor.addChild(root_1, stream_having_clause.nextTree());

                }
                stream_having_clause.reset();

                // PLSQL_DMLParser.g:231:103: ( model_clause )?
                if ( stream_model_clause.hasNext() ) {
                    adaptor.addChild(root_1, stream_model_clause.nextTree());

                }
                stream_model_clause.reset();

                adaptor.addChild(root_0, root_1);
                }

            }

            else // 232:9: -> ^( select_key from_clause ( distinct_key )? ( unique_key )? ( all_key )? ^( SELECT_LIST ( selected_element )+ ) ( into_clause )? ( where_clause )? ( hierarchical_query_clause )? ( group_by_clause )? ( having_clause )? ( model_clause )? )
            {
                // PLSQL_DMLParser.g:232:12: ^( select_key from_clause ( distinct_key )? ( unique_key )? ( all_key )? ^( SELECT_LIST ( selected_element )+ ) ( into_clause )? ( where_clause )? ( hierarchical_query_clause )? ( group_by_clause )? ( having_clause )? ( model_clause )? )
                {
                Object root_1 = (Object)adaptor.nil();
                root_1 = (Object)adaptor.becomeRoot(stream_select_key.nextNode(), root_1);

                adaptor.addChild(root_1, stream_from_clause.nextTree());

                // PLSQL_DMLParser.g:232:37: ( distinct_key )?
                if ( stream_distinct_key.hasNext() ) {
                    adaptor.addChild(root_1, stream_distinct_key.nextTree());

                }
                stream_distinct_key.reset();

                // PLSQL_DMLParser.g:232:51: ( unique_key )?
                if ( stream_unique_key.hasNext() ) {
                    adaptor.addChild(root_1, stream_unique_key.nextTree());

                }
                stream_unique_key.reset();

                // PLSQL_DMLParser.g:232:63: ( all_key )?
                if ( stream_all_key.hasNext() ) {
                    adaptor.addChild(root_1, stream_all_key.nextTree());

                }
                stream_all_key.reset();

                // PLSQL_DMLParser.g:232:72: ^( SELECT_LIST ( selected_element )+ )
                {
                Object root_2 = (Object)adaptor.nil();
                root_2 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(SELECT_LIST, "SELECT_LIST")
                , root_2);

                if ( !(stream_selected_element.hasNext()) ) {
                    throw new RewriteEarlyExitException();
                }
                while ( stream_selected_element.hasNext() ) {
                    adaptor.addChild(root_2, stream_selected_element.nextTree());

                }
                stream_selected_element.reset();

                adaptor.addChild(root_1, root_2);
                }

                // PLSQL_DMLParser.g:233:17: ( into_clause )?
                if ( stream_into_clause.hasNext() ) {
                    adaptor.addChild(root_1, stream_into_clause.nextTree());

                }
                stream_into_clause.reset();

                // PLSQL_DMLParser.g:233:30: ( where_clause )?
                if ( stream_where_clause.hasNext() ) {
                    adaptor.addChild(root_1, stream_where_clause.nextTree());

                }
                stream_where_clause.reset();

                // PLSQL_DMLParser.g:233:44: ( hierarchical_query_clause )?
                if ( stream_hierarchical_query_clause.hasNext() ) {
                    adaptor.addChild(root_1, stream_hierarchical_query_clause.nextTree());

                }
                stream_hierarchical_query_clause.reset();

                // PLSQL_DMLParser.g:233:71: ( group_by_clause )?
                if ( stream_group_by_clause.hasNext() ) {
                    adaptor.addChild(root_1, stream_group_by_clause.nextTree());

                }
                stream_group_by_clause.reset();

                // PLSQL_DMLParser.g:233:88: ( having_clause )?
                if ( stream_having_clause.hasNext() ) {
                    adaptor.addChild(root_1, stream_having_clause.nextTree());

                }
                stream_having_clause.reset();

                // PLSQL_DMLParser.g:233:103: ( model_clause )?
                if ( stream_model_clause.hasNext() ) {
                    adaptor.addChild(root_1, stream_model_clause.nextTree());

                }
                stream_model_clause.reset();

                adaptor.addChild(root_0, root_1);
                }

            }


            retval.tree = root_0;
            }

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "query_block"


    public static class selected_element_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "selected_element"
    // PLSQL_DMLParser.g:236:1: selected_element : select_list_elements ( alias )? -> ^( SELECT_ITEM select_list_elements ( alias )? ) ;
    public final PLSQLParser_PLSQL_DMLParser.selected_element_return selected_element() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.selected_element_return retval = new PLSQLParser_PLSQL_DMLParser.selected_element_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        PLSQLParser_PLSQL_DMLParser.select_list_elements_return select_list_elements48 =null;

        PLSQLParser_PLSQLCommons.alias_return alias49 =null;


        RewriteRuleSubtreeStream stream_alias=new RewriteRuleSubtreeStream(adaptor,"rule alias");
        RewriteRuleSubtreeStream stream_select_list_elements=new RewriteRuleSubtreeStream(adaptor,"rule select_list_elements");
        try {
            // PLSQL_DMLParser.g:237:5: ( select_list_elements ( alias )? -> ^( SELECT_ITEM select_list_elements ( alias )? ) )
            // PLSQL_DMLParser.g:237:10: select_list_elements ( alias )?
            {
            pushFollow(FOLLOW_select_list_elements_in_selected_element1250);
            select_list_elements48=select_list_elements();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_select_list_elements.add(select_list_elements48.getTree());

            // PLSQL_DMLParser.g:237:31: ( alias )?
            int alt20=2;
            int LA20_0 = input.LA(1);

            if ( (LA20_0==CHAR_STRING||LA20_0==DELIMITED_ID||LA20_0==INTRODUCER||LA20_0==SQL92_RESERVED_AS) ) {
                alt20=1;
            }
            else if ( (LA20_0==REGULAR_ID) ) {
                int LA20_2 = input.LA(2);

                if ( (LA20_2==COMMA||LA20_2==SQL92_RESERVED_FROM||LA20_2==SQL92_RESERVED_INTO) ) {
                    alt20=1;
                }
                else if ( (LA20_2==REGULAR_ID) ) {
                    int LA20_4 = input.LA(3);

                    if ( (LA20_4==REGULAR_ID) ) {
                        alt20=1;
                    }
                }
            }
            switch (alt20) {
                case 1 :
                    // PLSQL_DMLParser.g:237:31: alias
                    {
                    pushFollow(FOLLOW_alias_in_selected_element1252);
                    alias49=gPLSQLParser.alias();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_alias.add(alias49.getTree());

                    }
                    break;

            }


            // AST REWRITE
            // elements: alias, select_list_elements
            // token labels: 
            // rule labels: retval
            // token list labels: 
            // rule list labels: 
            // wildcard labels: 
            if ( state.backtracking==0 ) {

            retval.tree = root_0;
            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

            root_0 = (Object)adaptor.nil();
            // 238:9: -> ^( SELECT_ITEM select_list_elements ( alias )? )
            {
                // PLSQL_DMLParser.g:238:12: ^( SELECT_ITEM select_list_elements ( alias )? )
                {
                Object root_1 = (Object)adaptor.nil();
                root_1 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(SELECT_ITEM, "SELECT_ITEM")
                , root_1);

                adaptor.addChild(root_1, stream_select_list_elements.nextTree());

                // PLSQL_DMLParser.g:238:47: ( alias )?
                if ( stream_alias.hasNext() ) {
                    adaptor.addChild(root_1, stream_alias.nextTree());

                }
                stream_alias.reset();

                adaptor.addChild(root_0, root_1);
                }

            }


            retval.tree = root_0;
            }

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "selected_element"


    public static class from_clause_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "from_clause"
    // PLSQL_DMLParser.g:241:1: from_clause : from_key ^ table_ref_list ;
    public final PLSQLParser_PLSQL_DMLParser.from_clause_return from_clause() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.from_clause_return retval = new PLSQLParser_PLSQL_DMLParser.from_clause_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        PLSQLParser_PLSQLKeys.from_key_return from_key50 =null;

        PLSQLParser_PLSQL_DMLParser.table_ref_list_return table_ref_list51 =null;



        try {
            // PLSQL_DMLParser.g:242:5: ( from_key ^ table_ref_list )
            // PLSQL_DMLParser.g:242:10: from_key ^ table_ref_list
            {
            root_0 = (Object)adaptor.nil();


            pushFollow(FOLLOW_from_key_in_from_clause1292);
            from_key50=gPLSQLParser.from_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) root_0 = (Object)adaptor.becomeRoot(from_key50.getTree(), root_0);

            pushFollow(FOLLOW_table_ref_list_in_from_clause1295);
            table_ref_list51=table_ref_list();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) adaptor.addChild(root_0, table_ref_list51.getTree());

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "from_clause"


    public static class select_list_elements_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "select_list_elements"
    // PLSQL_DMLParser.g:245:1: select_list_elements : ( ( tableview_name PERIOD ASTERISK )=> tableview_name PERIOD ASTERISK -> ^( EXPR ^( DOT_ASTERISK[$ASTERISK] tableview_name ) ) | expression -> ^( EXPR expression ) );
    public final PLSQLParser_PLSQL_DMLParser.select_list_elements_return select_list_elements() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.select_list_elements_return retval = new PLSQLParser_PLSQL_DMLParser.select_list_elements_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token PERIOD53=null;
        Token ASTERISK54=null;
        PLSQLParser_PLSQLCommons.tableview_name_return tableview_name52 =null;

        PLSQLParser_PLSQL_DMLParser.expression_return expression55 =null;


        Object PERIOD53_tree=null;
        Object ASTERISK54_tree=null;
        RewriteRuleTokenStream stream_PERIOD=new RewriteRuleTokenStream(adaptor,"token PERIOD");
        RewriteRuleTokenStream stream_ASTERISK=new RewriteRuleTokenStream(adaptor,"token ASTERISK");
        RewriteRuleSubtreeStream stream_expression=new RewriteRuleSubtreeStream(adaptor,"rule expression");
        RewriteRuleSubtreeStream stream_tableview_name=new RewriteRuleSubtreeStream(adaptor,"rule tableview_name");
        try {
            // PLSQL_DMLParser.g:246:5: ( ( tableview_name PERIOD ASTERISK )=> tableview_name PERIOD ASTERISK -> ^( EXPR ^( DOT_ASTERISK[$ASTERISK] tableview_name ) ) | expression -> ^( EXPR expression ) )
            int alt21=2;
            switch ( input.LA(1) ) {
            case INTRODUCER:
                {
                int LA21_1 = input.LA(2);

                if ( (synpred3_PLSQL_DMLParser()) ) {
                    alt21=1;
                }
                else if ( (true) ) {
                    alt21=2;
                }
                else {
                    if (state.backtracking>0) {state.failed=true; return retval;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 21, 1, input);

                    throw nvae;

                }
                }
                break;
            case REGULAR_ID:
                {
                int LA21_2 = input.LA(2);

                if ( (synpred3_PLSQL_DMLParser()) ) {
                    alt21=1;
                }
                else if ( (true) ) {
                    alt21=2;
                }
                else {
                    if (state.backtracking>0) {state.failed=true; return retval;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 21, 2, input);

                    throw nvae;

                }
                }
                break;
            case DELIMITED_ID:
                {
                int LA21_3 = input.LA(2);

                if ( (synpred3_PLSQL_DMLParser()) ) {
                    alt21=1;
                }
                else if ( (true) ) {
                    alt21=2;
                }
                else {
                    if (state.backtracking>0) {state.failed=true; return retval;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 21, 3, input);

                    throw nvae;

                }
                }
                break;
            case APPROXIMATE_NUM_LIT:
            case CHAR_STRING:
            case COLON:
            case EXACT_NUM_LIT:
            case LEFT_PAREN:
            case MINUS_SIGN:
            case PLUS_SIGN:
            case SQL92_RESERVED_ALL:
            case SQL92_RESERVED_ANY:
            case SQL92_RESERVED_CASE:
            case SQL92_RESERVED_DEFAULT:
            case SQL92_RESERVED_DISTINCT:
            case SQL92_RESERVED_EXISTS:
            case SQL92_RESERVED_FALSE:
            case SQL92_RESERVED_NOT:
            case SQL92_RESERVED_NULL:
            case SQL92_RESERVED_PRIOR:
            case SQL92_RESERVED_TRUE:
            case UNSIGNED_INTEGER:
                {
                alt21=2;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return retval;}
                NoViableAltException nvae =
                    new NoViableAltException("", 21, 0, input);

                throw nvae;

            }

            switch (alt21) {
                case 1 :
                    // PLSQL_DMLParser.g:246:10: ( tableview_name PERIOD ASTERISK )=> tableview_name PERIOD ASTERISK
                    {
                    pushFollow(FOLLOW_tableview_name_in_select_list_elements1324);
                    tableview_name52=gPLSQLParser.tableview_name();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_tableview_name.add(tableview_name52.getTree());

                    PERIOD53=(Token)match(input,PERIOD,FOLLOW_PERIOD_in_select_list_elements1326); if (state.failed) return retval; 
                    if ( state.backtracking==0 ) stream_PERIOD.add(PERIOD53);


                    ASTERISK54=(Token)match(input,ASTERISK,FOLLOW_ASTERISK_in_select_list_elements1328); if (state.failed) return retval; 
                    if ( state.backtracking==0 ) stream_ASTERISK.add(ASTERISK54);


                    // AST REWRITE
                    // elements: tableview_name
                    // token labels: 
                    // rule labels: retval
                    // token list labels: 
                    // rule list labels: 
                    // wildcard labels: 
                    if ( state.backtracking==0 ) {

                    retval.tree = root_0;
                    RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

                    root_0 = (Object)adaptor.nil();
                    // 246:76: -> ^( EXPR ^( DOT_ASTERISK[$ASTERISK] tableview_name ) )
                    {
                        // PLSQL_DMLParser.g:246:79: ^( EXPR ^( DOT_ASTERISK[$ASTERISK] tableview_name ) )
                        {
                        Object root_1 = (Object)adaptor.nil();
                        root_1 = (Object)adaptor.becomeRoot(
                        (Object)adaptor.create(EXPR, "EXPR")
                        , root_1);

                        // PLSQL_DMLParser.g:246:86: ^( DOT_ASTERISK[$ASTERISK] tableview_name )
                        {
                        Object root_2 = (Object)adaptor.nil();
                        root_2 = (Object)adaptor.becomeRoot(
                        (Object)adaptor.create(DOT_ASTERISK, ASTERISK54)
                        , root_2);

                        adaptor.addChild(root_2, stream_tableview_name.nextTree());

                        adaptor.addChild(root_1, root_2);
                        }

                        adaptor.addChild(root_0, root_1);
                        }

                    }


                    retval.tree = root_0;
                    }

                    }
                    break;
                case 2 :
                    // PLSQL_DMLParser.g:247:10: expression
                    {
                    pushFollow(FOLLOW_expression_in_select_list_elements1354);
                    expression55=expression();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_expression.add(expression55.getTree());

                    // AST REWRITE
                    // elements: expression
                    // token labels: 
                    // rule labels: retval
                    // token list labels: 
                    // rule list labels: 
                    // wildcard labels: 
                    if ( state.backtracking==0 ) {

                    retval.tree = root_0;
                    RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

                    root_0 = (Object)adaptor.nil();
                    // 247:21: -> ^( EXPR expression )
                    {
                        // PLSQL_DMLParser.g:247:24: ^( EXPR expression )
                        {
                        Object root_1 = (Object)adaptor.nil();
                        root_1 = (Object)adaptor.becomeRoot(
                        (Object)adaptor.create(EXPR, "EXPR")
                        , root_1);

                        adaptor.addChild(root_1, stream_expression.nextTree());

                        adaptor.addChild(root_0, root_1);
                        }

                    }


                    retval.tree = root_0;
                    }

                    }
                    break;

            }
            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "select_list_elements"


    public static class table_ref_list_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "table_ref_list"
    // PLSQL_DMLParser.g:250:1: table_ref_list : table_ref ( COMMA ! table_ref )* ;
    public final PLSQLParser_PLSQL_DMLParser.table_ref_list_return table_ref_list() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.table_ref_list_return retval = new PLSQLParser_PLSQL_DMLParser.table_ref_list_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token COMMA57=null;
        PLSQLParser_PLSQL_DMLParser.table_ref_return table_ref56 =null;

        PLSQLParser_PLSQL_DMLParser.table_ref_return table_ref58 =null;


        Object COMMA57_tree=null;

        try {
            // PLSQL_DMLParser.g:251:5: ( table_ref ( COMMA ! table_ref )* )
            // PLSQL_DMLParser.g:251:10: table_ref ( COMMA ! table_ref )*
            {
            root_0 = (Object)adaptor.nil();


            pushFollow(FOLLOW_table_ref_in_table_ref_list1382);
            table_ref56=table_ref();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) adaptor.addChild(root_0, table_ref56.getTree());

            // PLSQL_DMLParser.g:251:20: ( COMMA ! table_ref )*
            loop22:
            do {
                int alt22=2;
                alt22 = dfa22.predict(input);
                switch (alt22) {
            	case 1 :
            	    // PLSQL_DMLParser.g:251:21: COMMA ! table_ref
            	    {
            	    COMMA57=(Token)match(input,COMMA,FOLLOW_COMMA_in_table_ref_list1385); if (state.failed) return retval;

            	    pushFollow(FOLLOW_table_ref_in_table_ref_list1388);
            	    table_ref58=table_ref();

            	    state._fsp--;
            	    if (state.failed) return retval;
            	    if ( state.backtracking==0 ) adaptor.addChild(root_0, table_ref58.getTree());

            	    }
            	    break;

            	default :
            	    break loop22;
                }
            } while (true);


            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "table_ref_list"


    public static class table_ref_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "table_ref"
    // PLSQL_DMLParser.g:254:1: table_ref : table_ref_aux ( join_clause )* -> ^( TABLE_REF table_ref_aux ( join_clause )* ) ;
    public final PLSQLParser_PLSQL_DMLParser.table_ref_return table_ref() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.table_ref_return retval = new PLSQLParser_PLSQL_DMLParser.table_ref_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        PLSQLParser_PLSQL_DMLParser.table_ref_aux_return table_ref_aux59 =null;

        PLSQLParser_PLSQL_DMLParser.join_clause_return join_clause60 =null;


        RewriteRuleSubtreeStream stream_join_clause=new RewriteRuleSubtreeStream(adaptor,"rule join_clause");
        RewriteRuleSubtreeStream stream_table_ref_aux=new RewriteRuleSubtreeStream(adaptor,"rule table_ref_aux");
        try {
            // PLSQL_DMLParser.g:255:5: ( table_ref_aux ( join_clause )* -> ^( TABLE_REF table_ref_aux ( join_clause )* ) )
            // PLSQL_DMLParser.g:255:10: table_ref_aux ( join_clause )*
            {
            pushFollow(FOLLOW_table_ref_aux_in_table_ref1410);
            table_ref_aux59=table_ref_aux();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_table_ref_aux.add(table_ref_aux59.getTree());

            // PLSQL_DMLParser.g:255:24: ( join_clause )*
            loop23:
            do {
                int alt23=2;
                int LA23_0 = input.LA(1);

                if ( (LA23_0==REGULAR_ID) ) {
                    int LA23_20 = input.LA(2);

                    if ( (((input.LT(1).getText().equalsIgnoreCase("natural"))||(input.LT(1).getText().equalsIgnoreCase("join"))||(input.LT(1).getText().equalsIgnoreCase("left"))||(input.LT(1).getText().equalsIgnoreCase("inner"))||(input.LT(1).getText().equalsIgnoreCase("full"))||(input.LT(1).getText().equalsIgnoreCase("partition"))||(input.LT(1).getText().equalsIgnoreCase("right"))||(input.LT(1).getText().equalsIgnoreCase("cross")))) ) {
                        alt23=1;
                    }


                }


                switch (alt23) {
            	case 1 :
            	    // PLSQL_DMLParser.g:255:24: join_clause
            	    {
            	    pushFollow(FOLLOW_join_clause_in_table_ref1412);
            	    join_clause60=join_clause();

            	    state._fsp--;
            	    if (state.failed) return retval;
            	    if ( state.backtracking==0 ) stream_join_clause.add(join_clause60.getTree());

            	    }
            	    break;

            	default :
            	    break loop23;
                }
            } while (true);


            // AST REWRITE
            // elements: join_clause, table_ref_aux
            // token labels: 
            // rule labels: retval
            // token list labels: 
            // rule list labels: 
            // wildcard labels: 
            if ( state.backtracking==0 ) {

            retval.tree = root_0;
            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

            root_0 = (Object)adaptor.nil();
            // 256:9: -> ^( TABLE_REF table_ref_aux ( join_clause )* )
            {
                // PLSQL_DMLParser.g:256:12: ^( TABLE_REF table_ref_aux ( join_clause )* )
                {
                Object root_1 = (Object)adaptor.nil();
                root_1 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(TABLE_REF, "TABLE_REF")
                , root_1);

                adaptor.addChild(root_1, stream_table_ref_aux.nextTree());

                // PLSQL_DMLParser.g:256:38: ( join_clause )*
                while ( stream_join_clause.hasNext() ) {
                    adaptor.addChild(root_1, stream_join_clause.nextTree());

                }
                stream_join_clause.reset();

                adaptor.addChild(root_0, root_1);
                }

            }


            retval.tree = root_0;
            }

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "table_ref"


    public static class table_ref_aux_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "table_ref_aux"
    // PLSQL_DMLParser.g:259:1: table_ref_aux : ( dml_table_expression_clause ( pivot_clause | unpivot_clause )? | only_key LEFT_PAREN dml_table_expression_clause RIGHT_PAREN ) ( flashback_query_clause )* ({...}? alias )? -> ^( TABLE_REF_ELEMENT ( alias )? dml_table_expression_clause ( only_key )? ( pivot_clause )? ( unpivot_clause )? ( flashback_query_clause )* ) ;
    public final PLSQLParser_PLSQL_DMLParser.table_ref_aux_return table_ref_aux() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.table_ref_aux_return retval = new PLSQLParser_PLSQL_DMLParser.table_ref_aux_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token LEFT_PAREN65=null;
        Token RIGHT_PAREN67=null;
        PLSQLParser_PLSQL_DMLParser.dml_table_expression_clause_return dml_table_expression_clause61 =null;

        PLSQLParser_PLSQL_DMLParser.pivot_clause_return pivot_clause62 =null;

        PLSQLParser_PLSQL_DMLParser.unpivot_clause_return unpivot_clause63 =null;

        PLSQLParser_PLSQLKeys.only_key_return only_key64 =null;

        PLSQLParser_PLSQL_DMLParser.dml_table_expression_clause_return dml_table_expression_clause66 =null;

        PLSQLParser_PLSQL_DMLParser.flashback_query_clause_return flashback_query_clause68 =null;

        PLSQLParser_PLSQLCommons.alias_return alias69 =null;


        Object LEFT_PAREN65_tree=null;
        Object RIGHT_PAREN67_tree=null;
        RewriteRuleTokenStream stream_LEFT_PAREN=new RewriteRuleTokenStream(adaptor,"token LEFT_PAREN");
        RewriteRuleTokenStream stream_RIGHT_PAREN=new RewriteRuleTokenStream(adaptor,"token RIGHT_PAREN");
        RewriteRuleSubtreeStream stream_dml_table_expression_clause=new RewriteRuleSubtreeStream(adaptor,"rule dml_table_expression_clause");
        RewriteRuleSubtreeStream stream_unpivot_clause=new RewriteRuleSubtreeStream(adaptor,"rule unpivot_clause");
        RewriteRuleSubtreeStream stream_alias=new RewriteRuleSubtreeStream(adaptor,"rule alias");
        RewriteRuleSubtreeStream stream_pivot_clause=new RewriteRuleSubtreeStream(adaptor,"rule pivot_clause");
        RewriteRuleSubtreeStream stream_only_key=new RewriteRuleSubtreeStream(adaptor,"rule only_key");
        RewriteRuleSubtreeStream stream_flashback_query_clause=new RewriteRuleSubtreeStream(adaptor,"rule flashback_query_clause");
        try {
            // PLSQL_DMLParser.g:260:5: ( ( dml_table_expression_clause ( pivot_clause | unpivot_clause )? | only_key LEFT_PAREN dml_table_expression_clause RIGHT_PAREN ) ( flashback_query_clause )* ({...}? alias )? -> ^( TABLE_REF_ELEMENT ( alias )? dml_table_expression_clause ( only_key )? ( pivot_clause )? ( unpivot_clause )? ( flashback_query_clause )* ) )
            // PLSQL_DMLParser.g:261:5: ( dml_table_expression_clause ( pivot_clause | unpivot_clause )? | only_key LEFT_PAREN dml_table_expression_clause RIGHT_PAREN ) ( flashback_query_clause )* ({...}? alias )?
            {
            // PLSQL_DMLParser.g:261:5: ( dml_table_expression_clause ( pivot_clause | unpivot_clause )? | only_key LEFT_PAREN dml_table_expression_clause RIGHT_PAREN )
            int alt25=2;
            int LA25_0 = input.LA(1);

            if ( (LA25_0==DELIMITED_ID||LA25_0==INTRODUCER||LA25_0==LEFT_PAREN||LA25_0==SQL92_RESERVED_TABLE) ) {
                alt25=1;
            }
            else if ( (LA25_0==REGULAR_ID) ) {
                int LA25_4 = input.LA(2);

                if ( (!(((input.LT(1).getText().equalsIgnoreCase("only"))))) ) {
                    alt25=1;
                }
                else if ( ((input.LT(1).getText().equalsIgnoreCase("only"))) ) {
                    alt25=2;
                }
                else {
                    if (state.backtracking>0) {state.failed=true; return retval;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 25, 4, input);

                    throw nvae;

                }
            }
            else {
                if (state.backtracking>0) {state.failed=true; return retval;}
                NoViableAltException nvae =
                    new NoViableAltException("", 25, 0, input);

                throw nvae;

            }
            switch (alt25) {
                case 1 :
                    // PLSQL_DMLParser.g:261:10: dml_table_expression_clause ( pivot_clause | unpivot_clause )?
                    {
                    pushFollow(FOLLOW_dml_table_expression_clause_in_table_ref_aux1458);
                    dml_table_expression_clause61=dml_table_expression_clause();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_dml_table_expression_clause.add(dml_table_expression_clause61.getTree());

                    // PLSQL_DMLParser.g:261:38: ( pivot_clause | unpivot_clause )?
                    int alt24=3;
                    int LA24_0 = input.LA(1);

                    if ( (LA24_0==REGULAR_ID) ) {
                        int LA24_1 = input.LA(2);

                        if ( (((input.LT(1).getText().equalsIgnoreCase("pivot")))) ) {
                            alt24=1;
                        }
                        else if ( (((input.LT(1).getText().equalsIgnoreCase("unpivot")))) ) {
                            alt24=2;
                        }
                    }
                    switch (alt24) {
                        case 1 :
                            // PLSQL_DMLParser.g:261:39: pivot_clause
                            {
                            pushFollow(FOLLOW_pivot_clause_in_table_ref_aux1461);
                            pivot_clause62=pivot_clause();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) stream_pivot_clause.add(pivot_clause62.getTree());

                            }
                            break;
                        case 2 :
                            // PLSQL_DMLParser.g:261:52: unpivot_clause
                            {
                            pushFollow(FOLLOW_unpivot_clause_in_table_ref_aux1463);
                            unpivot_clause63=unpivot_clause();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) stream_unpivot_clause.add(unpivot_clause63.getTree());

                            }
                            break;

                    }


                    }
                    break;
                case 2 :
                    // PLSQL_DMLParser.g:262:10: only_key LEFT_PAREN dml_table_expression_clause RIGHT_PAREN
                    {
                    pushFollow(FOLLOW_only_key_in_table_ref_aux1476);
                    only_key64=gPLSQLParser.only_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_only_key.add(only_key64.getTree());

                    LEFT_PAREN65=(Token)match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_table_ref_aux1478); if (state.failed) return retval; 
                    if ( state.backtracking==0 ) stream_LEFT_PAREN.add(LEFT_PAREN65);


                    pushFollow(FOLLOW_dml_table_expression_clause_in_table_ref_aux1480);
                    dml_table_expression_clause66=dml_table_expression_clause();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_dml_table_expression_clause.add(dml_table_expression_clause66.getTree());

                    RIGHT_PAREN67=(Token)match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_table_ref_aux1482); if (state.failed) return retval; 
                    if ( state.backtracking==0 ) stream_RIGHT_PAREN.add(RIGHT_PAREN67);


                    }
                    break;

            }


            // PLSQL_DMLParser.g:264:9: ( flashback_query_clause )*
            loop26:
            do {
                int alt26=2;
                int LA26_0 = input.LA(1);

                if ( (LA26_0==SQL92_RESERVED_AS) ) {
                    int LA26_1 = input.LA(2);

                    if ( (LA26_1==SQL92_RESERVED_OF) ) {
                        alt26=1;
                    }


                }
                else if ( (LA26_0==REGULAR_ID) ) {
                    int LA26_3 = input.LA(2);

                    if ( (LA26_3==SQL92_RESERVED_BETWEEN) && ((input.LT(1).getText().equalsIgnoreCase("versions")))) {
                        alt26=1;
                    }


                }


                switch (alt26) {
            	case 1 :
            	    // PLSQL_DMLParser.g:264:9: flashback_query_clause
            	    {
            	    pushFollow(FOLLOW_flashback_query_clause_in_table_ref_aux1498);
            	    flashback_query_clause68=flashback_query_clause();

            	    state._fsp--;
            	    if (state.failed) return retval;
            	    if ( state.backtracking==0 ) stream_flashback_query_clause.add(flashback_query_clause68.getTree());

            	    }
            	    break;

            	default :
            	    break loop26;
                }
            } while (true);


            // PLSQL_DMLParser.g:265:9: ({...}? alias )?
            int alt27=2;
            alt27 = dfa27.predict(input);
            switch (alt27) {
                case 1 :
                    // PLSQL_DMLParser.g:265:10: {...}? alias
                    {
                    if ( !((isTableAlias())) ) {
                        if (state.backtracking>0) {state.failed=true; return retval;}
                        throw new FailedPredicateException(input, "table_ref_aux", "isTableAlias()");
                    }

                    pushFollow(FOLLOW_alias_in_table_ref_aux1512);
                    alias69=gPLSQLParser.alias();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_alias.add(alias69.getTree());

                    }
                    break;

            }


            // AST REWRITE
            // elements: unpivot_clause, only_key, alias, flashback_query_clause, pivot_clause, dml_table_expression_clause
            // token labels: 
            // rule labels: retval
            // token list labels: 
            // rule list labels: 
            // wildcard labels: 
            if ( state.backtracking==0 ) {

            retval.tree = root_0;
            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

            root_0 = (Object)adaptor.nil();
            // 266:9: -> ^( TABLE_REF_ELEMENT ( alias )? dml_table_expression_clause ( only_key )? ( pivot_clause )? ( unpivot_clause )? ( flashback_query_clause )* )
            {
                // PLSQL_DMLParser.g:266:12: ^( TABLE_REF_ELEMENT ( alias )? dml_table_expression_clause ( only_key )? ( pivot_clause )? ( unpivot_clause )? ( flashback_query_clause )* )
                {
                Object root_1 = (Object)adaptor.nil();
                root_1 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(TABLE_REF_ELEMENT, "TABLE_REF_ELEMENT")
                , root_1);

                // PLSQL_DMLParser.g:266:32: ( alias )?
                if ( stream_alias.hasNext() ) {
                    adaptor.addChild(root_1, stream_alias.nextTree());

                }
                stream_alias.reset();

                adaptor.addChild(root_1, stream_dml_table_expression_clause.nextTree());

                // PLSQL_DMLParser.g:266:67: ( only_key )?
                if ( stream_only_key.hasNext() ) {
                    adaptor.addChild(root_1, stream_only_key.nextTree());

                }
                stream_only_key.reset();

                // PLSQL_DMLParser.g:266:77: ( pivot_clause )?
                if ( stream_pivot_clause.hasNext() ) {
                    adaptor.addChild(root_1, stream_pivot_clause.nextTree());

                }
                stream_pivot_clause.reset();

                // PLSQL_DMLParser.g:266:91: ( unpivot_clause )?
                if ( stream_unpivot_clause.hasNext() ) {
                    adaptor.addChild(root_1, stream_unpivot_clause.nextTree());

                }
                stream_unpivot_clause.reset();

                // PLSQL_DMLParser.g:266:107: ( flashback_query_clause )*
                while ( stream_flashback_query_clause.hasNext() ) {
                    adaptor.addChild(root_1, stream_flashback_query_clause.nextTree());

                }
                stream_flashback_query_clause.reset();

                adaptor.addChild(root_0, root_1);
                }

            }


            retval.tree = root_0;
            }

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "table_ref_aux"


    public static class join_clause_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "join_clause"
    // PLSQL_DMLParser.g:269:1: join_clause : ( query_partition_clause )? ( cross_key | natural_key )? ( inner_key | outer_join_type )? join_key table_ref_aux ( query_partition_clause )? ( join_on_part | join_using_part )? -> ^( JOIN_DEF[$join_key.start] ( cross_key )? ( natural_key )? ( inner_key )? ( outer_join_type )? table_ref_aux ( query_partition_clause )* ( join_on_part )? ( join_using_part )? ) ;
    public final PLSQLParser_PLSQL_DMLParser.join_clause_return join_clause() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.join_clause_return retval = new PLSQLParser_PLSQL_DMLParser.join_clause_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        PLSQLParser_PLSQL_DMLParser.query_partition_clause_return query_partition_clause70 =null;

        PLSQLParser_PLSQLKeys.cross_key_return cross_key71 =null;

        PLSQLParser_PLSQLKeys.natural_key_return natural_key72 =null;

        PLSQLParser_PLSQLKeys.inner_key_return inner_key73 =null;

        PLSQLParser_PLSQL_DMLParser.outer_join_type_return outer_join_type74 =null;

        PLSQLParser_PLSQLKeys.join_key_return join_key75 =null;

        PLSQLParser_PLSQL_DMLParser.table_ref_aux_return table_ref_aux76 =null;

        PLSQLParser_PLSQL_DMLParser.query_partition_clause_return query_partition_clause77 =null;

        PLSQLParser_PLSQL_DMLParser.join_on_part_return join_on_part78 =null;

        PLSQLParser_PLSQL_DMLParser.join_using_part_return join_using_part79 =null;


        RewriteRuleSubtreeStream stream_inner_key=new RewriteRuleSubtreeStream(adaptor,"rule inner_key");
        RewriteRuleSubtreeStream stream_join_using_part=new RewriteRuleSubtreeStream(adaptor,"rule join_using_part");
        RewriteRuleSubtreeStream stream_join_on_part=new RewriteRuleSubtreeStream(adaptor,"rule join_on_part");
        RewriteRuleSubtreeStream stream_join_key=new RewriteRuleSubtreeStream(adaptor,"rule join_key");
        RewriteRuleSubtreeStream stream_outer_join_type=new RewriteRuleSubtreeStream(adaptor,"rule outer_join_type");
        RewriteRuleSubtreeStream stream_query_partition_clause=new RewriteRuleSubtreeStream(adaptor,"rule query_partition_clause");
        RewriteRuleSubtreeStream stream_cross_key=new RewriteRuleSubtreeStream(adaptor,"rule cross_key");
        RewriteRuleSubtreeStream stream_natural_key=new RewriteRuleSubtreeStream(adaptor,"rule natural_key");
        RewriteRuleSubtreeStream stream_table_ref_aux=new RewriteRuleSubtreeStream(adaptor,"rule table_ref_aux");
        try {
            // PLSQL_DMLParser.g:270:5: ( ( query_partition_clause )? ( cross_key | natural_key )? ( inner_key | outer_join_type )? join_key table_ref_aux ( query_partition_clause )? ( join_on_part | join_using_part )? -> ^( JOIN_DEF[$join_key.start] ( cross_key )? ( natural_key )? ( inner_key )? ( outer_join_type )? table_ref_aux ( query_partition_clause )* ( join_on_part )? ( join_using_part )? ) )
            // PLSQL_DMLParser.g:270:10: ( query_partition_clause )? ( cross_key | natural_key )? ( inner_key | outer_join_type )? join_key table_ref_aux ( query_partition_clause )? ( join_on_part | join_using_part )?
            {
            // PLSQL_DMLParser.g:270:10: ( query_partition_clause )?
            int alt28=2;
            int LA28_0 = input.LA(1);

            if ( (LA28_0==REGULAR_ID) && (((input.LT(1).getText().equalsIgnoreCase("natural"))||(input.LT(1).getText().equalsIgnoreCase("join"))||(input.LT(1).getText().equalsIgnoreCase("inner"))||(input.LT(1).getText().equalsIgnoreCase("left"))||(input.LT(1).getText().equalsIgnoreCase("full"))||(input.LT(1).getText().equalsIgnoreCase("right"))||(input.LT(1).getText().equalsIgnoreCase("partition"))||(input.LT(1).getText().equalsIgnoreCase("cross"))))) {
                int LA28_1 = input.LA(2);

                if ( (LA28_1==SQL92_RESERVED_BY) && ((input.LT(1).getText().equalsIgnoreCase("partition")))) {
                    alt28=1;
                }
            }
            switch (alt28) {
                case 1 :
                    // PLSQL_DMLParser.g:270:10: query_partition_clause
                    {
                    pushFollow(FOLLOW_query_partition_clause_in_join_clause1565);
                    query_partition_clause70=query_partition_clause();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_query_partition_clause.add(query_partition_clause70.getTree());

                    }
                    break;

            }


            // PLSQL_DMLParser.g:271:9: ( cross_key | natural_key )?
            int alt29=3;
            int LA29_0 = input.LA(1);

            if ( (LA29_0==REGULAR_ID) && (((input.LT(1).getText().equalsIgnoreCase("natural"))||(input.LT(1).getText().equalsIgnoreCase("join"))||(input.LT(1).getText().equalsIgnoreCase("left"))||(input.LT(1).getText().equalsIgnoreCase("inner"))||(input.LT(1).getText().equalsIgnoreCase("full"))||(input.LT(1).getText().equalsIgnoreCase("right"))||(input.LT(1).getText().equalsIgnoreCase("cross"))))) {
                int LA29_1 = input.LA(2);

                if ( ((input.LT(1).getText().equalsIgnoreCase("cross"))) ) {
                    alt29=1;
                }
                else if ( ((input.LT(1).getText().equalsIgnoreCase("natural"))) ) {
                    alt29=2;
                }
            }
            switch (alt29) {
                case 1 :
                    // PLSQL_DMLParser.g:271:10: cross_key
                    {
                    pushFollow(FOLLOW_cross_key_in_join_clause1577);
                    cross_key71=gPLSQLParser.cross_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_cross_key.add(cross_key71.getTree());

                    }
                    break;
                case 2 :
                    // PLSQL_DMLParser.g:271:20: natural_key
                    {
                    pushFollow(FOLLOW_natural_key_in_join_clause1579);
                    natural_key72=gPLSQLParser.natural_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_natural_key.add(natural_key72.getTree());

                    }
                    break;

            }


            // PLSQL_DMLParser.g:271:34: ( inner_key | outer_join_type )?
            int alt30=3;
            int LA30_0 = input.LA(1);

            if ( (LA30_0==REGULAR_ID) && (((input.LT(1).getText().equalsIgnoreCase("join"))||(input.LT(1).getText().equalsIgnoreCase("inner"))||(input.LT(1).getText().equalsIgnoreCase("left"))||(input.LT(1).getText().equalsIgnoreCase("full"))||(input.LT(1).getText().equalsIgnoreCase("right"))))) {
                int LA30_1 = input.LA(2);

                if ( ((input.LT(1).getText().equalsIgnoreCase("inner"))) ) {
                    alt30=1;
                }
                else if ( (((input.LT(1).getText().equalsIgnoreCase("left"))||(input.LT(1).getText().equalsIgnoreCase("full"))||(input.LT(1).getText().equalsIgnoreCase("right")))) ) {
                    alt30=2;
                }
            }
            switch (alt30) {
                case 1 :
                    // PLSQL_DMLParser.g:271:35: inner_key
                    {
                    pushFollow(FOLLOW_inner_key_in_join_clause1584);
                    inner_key73=gPLSQLParser.inner_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_inner_key.add(inner_key73.getTree());

                    }
                    break;
                case 2 :
                    // PLSQL_DMLParser.g:271:45: outer_join_type
                    {
                    pushFollow(FOLLOW_outer_join_type_in_join_clause1586);
                    outer_join_type74=outer_join_type();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_outer_join_type.add(outer_join_type74.getTree());

                    }
                    break;

            }


            pushFollow(FOLLOW_join_key_in_join_clause1590);
            join_key75=gPLSQLParser.join_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_join_key.add(join_key75.getTree());

            pushFollow(FOLLOW_table_ref_aux_in_join_clause1600);
            table_ref_aux76=table_ref_aux();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_table_ref_aux.add(table_ref_aux76.getTree());

            // PLSQL_DMLParser.g:273:9: ( query_partition_clause )?
            int alt31=2;
            int LA31_0 = input.LA(1);

            if ( (LA31_0==REGULAR_ID) ) {
                int LA31_1 = input.LA(2);

                if ( ((input.LT(1).getText().equalsIgnoreCase("partition"))) ) {
                    alt31=1;
                }
            }
            switch (alt31) {
                case 1 :
                    // PLSQL_DMLParser.g:273:9: query_partition_clause
                    {
                    pushFollow(FOLLOW_query_partition_clause_in_join_clause1610);
                    query_partition_clause77=query_partition_clause();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_query_partition_clause.add(query_partition_clause77.getTree());

                    }
                    break;

            }


            // PLSQL_DMLParser.g:274:5: ( join_on_part | join_using_part )?
            int alt32=3;
            int LA32_0 = input.LA(1);

            if ( (LA32_0==SQL92_RESERVED_ON) ) {
                alt32=1;
            }
            else if ( (LA32_0==PLSQL_NON_RESERVED_USING) ) {
                alt32=2;
            }
            switch (alt32) {
                case 1 :
                    // PLSQL_DMLParser.g:274:10: join_on_part
                    {
                    pushFollow(FOLLOW_join_on_part_in_join_clause1622);
                    join_on_part78=join_on_part();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_join_on_part.add(join_on_part78.getTree());

                    }
                    break;
                case 2 :
                    // PLSQL_DMLParser.g:275:10: join_using_part
                    {
                    pushFollow(FOLLOW_join_using_part_in_join_clause1633);
                    join_using_part79=join_using_part();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_join_using_part.add(join_using_part79.getTree());

                    }
                    break;

            }


            // AST REWRITE
            // elements: query_partition_clause, cross_key, join_on_part, outer_join_type, join_using_part, table_ref_aux, natural_key, inner_key
            // token labels: 
            // rule labels: retval
            // token list labels: 
            // rule list labels: 
            // wildcard labels: 
            if ( state.backtracking==0 ) {

            retval.tree = root_0;
            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

            root_0 = (Object)adaptor.nil();
            // 277:9: -> ^( JOIN_DEF[$join_key.start] ( cross_key )? ( natural_key )? ( inner_key )? ( outer_join_type )? table_ref_aux ( query_partition_clause )* ( join_on_part )? ( join_using_part )? )
            {
                // PLSQL_DMLParser.g:277:12: ^( JOIN_DEF[$join_key.start] ( cross_key )? ( natural_key )? ( inner_key )? ( outer_join_type )? table_ref_aux ( query_partition_clause )* ( join_on_part )? ( join_using_part )? )
                {
                Object root_1 = (Object)adaptor.nil();
                root_1 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(JOIN_DEF, (join_key75!=null?((Token)join_key75.start):null))
                , root_1);

                // PLSQL_DMLParser.g:277:40: ( cross_key )?
                if ( stream_cross_key.hasNext() ) {
                    adaptor.addChild(root_1, stream_cross_key.nextTree());

                }
                stream_cross_key.reset();

                // PLSQL_DMLParser.g:277:51: ( natural_key )?
                if ( stream_natural_key.hasNext() ) {
                    adaptor.addChild(root_1, stream_natural_key.nextTree());

                }
                stream_natural_key.reset();

                // PLSQL_DMLParser.g:277:64: ( inner_key )?
                if ( stream_inner_key.hasNext() ) {
                    adaptor.addChild(root_1, stream_inner_key.nextTree());

                }
                stream_inner_key.reset();

                // PLSQL_DMLParser.g:277:75: ( outer_join_type )?
                if ( stream_outer_join_type.hasNext() ) {
                    adaptor.addChild(root_1, stream_outer_join_type.nextTree());

                }
                stream_outer_join_type.reset();

                adaptor.addChild(root_1, stream_table_ref_aux.nextTree());

                // PLSQL_DMLParser.g:277:106: ( query_partition_clause )*
                while ( stream_query_partition_clause.hasNext() ) {
                    adaptor.addChild(root_1, stream_query_partition_clause.nextTree());

                }
                stream_query_partition_clause.reset();

                // PLSQL_DMLParser.g:277:130: ( join_on_part )?
                if ( stream_join_on_part.hasNext() ) {
                    adaptor.addChild(root_1, stream_join_on_part.nextTree());

                }
                stream_join_on_part.reset();

                // PLSQL_DMLParser.g:277:144: ( join_using_part )?
                if ( stream_join_using_part.hasNext() ) {
                    adaptor.addChild(root_1, stream_join_using_part.nextTree());

                }
                stream_join_using_part.reset();

                adaptor.addChild(root_0, root_1);
                }

            }


            retval.tree = root_0;
            }

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "join_clause"


    public static class join_on_part_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "join_on_part"
    // PLSQL_DMLParser.g:280:1: join_on_part : on_key condition -> ^( on_key ^( LOGIC_EXPR condition ) ) ;
    public final PLSQLParser_PLSQL_DMLParser.join_on_part_return join_on_part() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.join_on_part_return retval = new PLSQLParser_PLSQL_DMLParser.join_on_part_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        PLSQLParser_PLSQLKeys.on_key_return on_key80 =null;

        PLSQLParser_PLSQL_DMLParser.condition_return condition81 =null;


        RewriteRuleSubtreeStream stream_condition=new RewriteRuleSubtreeStream(adaptor,"rule condition");
        RewriteRuleSubtreeStream stream_on_key=new RewriteRuleSubtreeStream(adaptor,"rule on_key");
        try {
            // PLSQL_DMLParser.g:281:5: ( on_key condition -> ^( on_key ^( LOGIC_EXPR condition ) ) )
            // PLSQL_DMLParser.g:281:10: on_key condition
            {
            pushFollow(FOLLOW_on_key_in_join_on_part1699);
            on_key80=gPLSQLParser.on_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_on_key.add(on_key80.getTree());

            pushFollow(FOLLOW_condition_in_join_on_part1701);
            condition81=condition();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_condition.add(condition81.getTree());

            // AST REWRITE
            // elements: condition, on_key
            // token labels: 
            // rule labels: retval
            // token list labels: 
            // rule list labels: 
            // wildcard labels: 
            if ( state.backtracking==0 ) {

            retval.tree = root_0;
            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

            root_0 = (Object)adaptor.nil();
            // 282:9: -> ^( on_key ^( LOGIC_EXPR condition ) )
            {
                // PLSQL_DMLParser.g:282:12: ^( on_key ^( LOGIC_EXPR condition ) )
                {
                Object root_1 = (Object)adaptor.nil();
                root_1 = (Object)adaptor.becomeRoot(stream_on_key.nextNode(), root_1);

                // PLSQL_DMLParser.g:282:21: ^( LOGIC_EXPR condition )
                {
                Object root_2 = (Object)adaptor.nil();
                root_2 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(LOGIC_EXPR, "LOGIC_EXPR")
                , root_2);

                adaptor.addChild(root_2, stream_condition.nextTree());

                adaptor.addChild(root_1, root_2);
                }

                adaptor.addChild(root_0, root_1);
                }

            }


            retval.tree = root_0;
            }

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "join_on_part"


    public static class join_using_part_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "join_using_part"
    // PLSQL_DMLParser.g:285:1: join_using_part : using_key ^ LEFT_PAREN ! column_name ( COMMA ! column_name )* RIGHT_PAREN !;
    public final PLSQLParser_PLSQL_DMLParser.join_using_part_return join_using_part() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.join_using_part_return retval = new PLSQLParser_PLSQL_DMLParser.join_using_part_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token LEFT_PAREN83=null;
        Token COMMA85=null;
        Token RIGHT_PAREN87=null;
        PLSQLParser_PLSQLKeys.using_key_return using_key82 =null;

        PLSQLParser_PLSQLCommons.column_name_return column_name84 =null;

        PLSQLParser_PLSQLCommons.column_name_return column_name86 =null;


        Object LEFT_PAREN83_tree=null;
        Object COMMA85_tree=null;
        Object RIGHT_PAREN87_tree=null;

        try {
            // PLSQL_DMLParser.g:286:5: ( using_key ^ LEFT_PAREN ! column_name ( COMMA ! column_name )* RIGHT_PAREN !)
            // PLSQL_DMLParser.g:286:10: using_key ^ LEFT_PAREN ! column_name ( COMMA ! column_name )* RIGHT_PAREN !
            {
            root_0 = (Object)adaptor.nil();


            pushFollow(FOLLOW_using_key_in_join_using_part1742);
            using_key82=gPLSQLParser.using_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) root_0 = (Object)adaptor.becomeRoot(using_key82.getTree(), root_0);

            LEFT_PAREN83=(Token)match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_join_using_part1745); if (state.failed) return retval;

            pushFollow(FOLLOW_column_name_in_join_using_part1748);
            column_name84=gPLSQLParser.column_name();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) adaptor.addChild(root_0, column_name84.getTree());

            // PLSQL_DMLParser.g:286:45: ( COMMA ! column_name )*
            loop33:
            do {
                int alt33=2;
                int LA33_0 = input.LA(1);

                if ( (LA33_0==COMMA) ) {
                    alt33=1;
                }


                switch (alt33) {
            	case 1 :
            	    // PLSQL_DMLParser.g:286:46: COMMA ! column_name
            	    {
            	    COMMA85=(Token)match(input,COMMA,FOLLOW_COMMA_in_join_using_part1751); if (state.failed) return retval;

            	    pushFollow(FOLLOW_column_name_in_join_using_part1754);
            	    column_name86=gPLSQLParser.column_name();

            	    state._fsp--;
            	    if (state.failed) return retval;
            	    if ( state.backtracking==0 ) adaptor.addChild(root_0, column_name86.getTree());

            	    }
            	    break;

            	default :
            	    break loop33;
                }
            } while (true);


            RIGHT_PAREN87=(Token)match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_join_using_part1758); if (state.failed) return retval;

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "join_using_part"


    public static class outer_join_type_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "outer_join_type"
    // PLSQL_DMLParser.g:289:1: outer_join_type : ( full_key | left_key | right_key ) ( outer_key !)? ;
    public final PLSQLParser_PLSQL_DMLParser.outer_join_type_return outer_join_type() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.outer_join_type_return retval = new PLSQLParser_PLSQL_DMLParser.outer_join_type_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        PLSQLParser_PLSQLKeys.full_key_return full_key88 =null;

        PLSQLParser_PLSQLKeys.left_key_return left_key89 =null;

        PLSQLParser_PLSQLKeys.right_key_return right_key90 =null;

        PLSQLParser_PLSQLKeys.outer_key_return outer_key91 =null;



        try {
            // PLSQL_DMLParser.g:290:5: ( ( full_key | left_key | right_key ) ( outer_key !)? )
            // PLSQL_DMLParser.g:291:5: ( full_key | left_key | right_key ) ( outer_key !)?
            {
            root_0 = (Object)adaptor.nil();


            // PLSQL_DMLParser.g:291:5: ( full_key | left_key | right_key )
            int alt34=3;
            int LA34_0 = input.LA(1);

            if ( (LA34_0==REGULAR_ID) && (((input.LT(1).getText().equalsIgnoreCase("left"))||(input.LT(1).getText().equalsIgnoreCase("full"))||(input.LT(1).getText().equalsIgnoreCase("right"))))) {
                int LA34_1 = input.LA(2);

                if ( ((input.LT(1).getText().equalsIgnoreCase("full"))) ) {
                    alt34=1;
                }
                else if ( ((input.LT(1).getText().equalsIgnoreCase("left"))) ) {
                    alt34=2;
                }
                else if ( ((input.LT(1).getText().equalsIgnoreCase("right"))) ) {
                    alt34=3;
                }
                else {
                    if (state.backtracking>0) {state.failed=true; return retval;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 34, 1, input);

                    throw nvae;

                }
            }
            else {
                if (state.backtracking>0) {state.failed=true; return retval;}
                NoViableAltException nvae =
                    new NoViableAltException("", 34, 0, input);

                throw nvae;

            }
            switch (alt34) {
                case 1 :
                    // PLSQL_DMLParser.g:291:10: full_key
                    {
                    pushFollow(FOLLOW_full_key_in_outer_join_type1789);
                    full_key88=gPLSQLParser.full_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, full_key88.getTree());

                    }
                    break;
                case 2 :
                    // PLSQL_DMLParser.g:292:10: left_key
                    {
                    pushFollow(FOLLOW_left_key_in_outer_join_type1800);
                    left_key89=gPLSQLParser.left_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, left_key89.getTree());

                    }
                    break;
                case 3 :
                    // PLSQL_DMLParser.g:293:10: right_key
                    {
                    pushFollow(FOLLOW_right_key_in_outer_join_type1811);
                    right_key90=gPLSQLParser.right_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, right_key90.getTree());

                    }
                    break;

            }


            // PLSQL_DMLParser.g:295:18: ( outer_key !)?
            int alt35=2;
            int LA35_0 = input.LA(1);

            if ( (LA35_0==REGULAR_ID) && (((input.LT(1).getText().equalsIgnoreCase("join"))||(input.LT(1).getText().equalsIgnoreCase("outer"))))) {
                int LA35_1 = input.LA(2);

                if ( ((input.LT(1).getText().equalsIgnoreCase("outer"))) ) {
                    alt35=1;
                }
            }
            switch (alt35) {
                case 1 :
                    // PLSQL_DMLParser.g:295:18: outer_key !
                    {
                    pushFollow(FOLLOW_outer_key_in_outer_join_type1827);
                    outer_key91=gPLSQLParser.outer_key();

                    state._fsp--;
                    if (state.failed) return retval;

                    }
                    break;

            }


            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "outer_join_type"


    public static class query_partition_clause_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "query_partition_clause"
    // PLSQL_DMLParser.g:298:1: query_partition_clause : partition_key by_key ( ( LEFT_PAREN )=> expression_list | expression ( COMMA expression )* ) -> ^( partition_key ( expression_list )? ( EXPR expression )* ) ;
    public final PLSQLParser_PLSQL_DMLParser.query_partition_clause_return query_partition_clause() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.query_partition_clause_return retval = new PLSQLParser_PLSQL_DMLParser.query_partition_clause_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token COMMA96=null;
        PLSQLParser_PLSQLKeys.partition_key_return partition_key92 =null;

        PLSQLParser_PLSQLKeys.by_key_return by_key93 =null;

        PLSQLParser_PLSQL_DMLParser.expression_list_return expression_list94 =null;

        PLSQLParser_PLSQL_DMLParser.expression_return expression95 =null;

        PLSQLParser_PLSQL_DMLParser.expression_return expression97 =null;


        Object COMMA96_tree=null;
        RewriteRuleTokenStream stream_COMMA=new RewriteRuleTokenStream(adaptor,"token COMMA");
        RewriteRuleSubtreeStream stream_expression=new RewriteRuleSubtreeStream(adaptor,"rule expression");
        RewriteRuleSubtreeStream stream_expression_list=new RewriteRuleSubtreeStream(adaptor,"rule expression_list");
        RewriteRuleSubtreeStream stream_partition_key=new RewriteRuleSubtreeStream(adaptor,"rule partition_key");
        RewriteRuleSubtreeStream stream_by_key=new RewriteRuleSubtreeStream(adaptor,"rule by_key");
        try {
            // PLSQL_DMLParser.g:299:5: ( partition_key by_key ( ( LEFT_PAREN )=> expression_list | expression ( COMMA expression )* ) -> ^( partition_key ( expression_list )? ( EXPR expression )* ) )
            // PLSQL_DMLParser.g:299:10: partition_key by_key ( ( LEFT_PAREN )=> expression_list | expression ( COMMA expression )* )
            {
            pushFollow(FOLLOW_partition_key_in_query_partition_clause1849);
            partition_key92=gPLSQLParser.partition_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_partition_key.add(partition_key92.getTree());

            pushFollow(FOLLOW_by_key_in_query_partition_clause1851);
            by_key93=gPLSQLParser.by_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_by_key.add(by_key93.getTree());

            // PLSQL_DMLParser.g:300:5: ( ( LEFT_PAREN )=> expression_list | expression ( COMMA expression )* )
            int alt37=2;
            int LA37_0 = input.LA(1);

            if ( (LA37_0==LEFT_PAREN) ) {
                int LA37_1 = input.LA(2);

                if ( (synpred4_PLSQL_DMLParser()) ) {
                    alt37=1;
                }
                else if ( (true) ) {
                    alt37=2;
                }
                else {
                    if (state.backtracking>0) {state.failed=true; return retval;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 37, 1, input);

                    throw nvae;

                }
            }
            else if ( (LA37_0==APPROXIMATE_NUM_LIT||(LA37_0 >= CHAR_STRING && LA37_0 <= COLON)||LA37_0==DELIMITED_ID||LA37_0==EXACT_NUM_LIT||LA37_0==INTRODUCER||LA37_0==MINUS_SIGN||LA37_0==PLUS_SIGN||LA37_0==REGULAR_ID||LA37_0==SQL92_RESERVED_ALL||LA37_0==SQL92_RESERVED_ANY||LA37_0==SQL92_RESERVED_CASE||LA37_0==SQL92_RESERVED_DEFAULT||LA37_0==SQL92_RESERVED_DISTINCT||(LA37_0 >= SQL92_RESERVED_EXISTS && LA37_0 <= SQL92_RESERVED_FALSE)||(LA37_0 >= SQL92_RESERVED_NOT && LA37_0 <= SQL92_RESERVED_NULL)||LA37_0==SQL92_RESERVED_PRIOR||LA37_0==SQL92_RESERVED_TRUE||LA37_0==UNSIGNED_INTEGER) ) {
                alt37=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return retval;}
                NoViableAltException nvae =
                    new NoViableAltException("", 37, 0, input);

                throw nvae;

            }
            switch (alt37) {
                case 1 :
                    // PLSQL_DMLParser.g:300:10: ( LEFT_PAREN )=> expression_list
                    {
                    pushFollow(FOLLOW_expression_list_in_query_partition_clause1867);
                    expression_list94=expression_list();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_expression_list.add(expression_list94.getTree());

                    }
                    break;
                case 2 :
                    // PLSQL_DMLParser.g:301:10: expression ( COMMA expression )*
                    {
                    pushFollow(FOLLOW_expression_in_query_partition_clause1878);
                    expression95=expression();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_expression.add(expression95.getTree());

                    // PLSQL_DMLParser.g:301:21: ( COMMA expression )*
                    loop36:
                    do {
                        int alt36=2;
                        int LA36_0 = input.LA(1);

                        if ( (LA36_0==COMMA) ) {
                            alt36=1;
                        }


                        switch (alt36) {
                    	case 1 :
                    	    // PLSQL_DMLParser.g:301:22: COMMA expression
                    	    {
                    	    COMMA96=(Token)match(input,COMMA,FOLLOW_COMMA_in_query_partition_clause1881); if (state.failed) return retval; 
                    	    if ( state.backtracking==0 ) stream_COMMA.add(COMMA96);


                    	    pushFollow(FOLLOW_expression_in_query_partition_clause1883);
                    	    expression97=expression();

                    	    state._fsp--;
                    	    if (state.failed) return retval;
                    	    if ( state.backtracking==0 ) stream_expression.add(expression97.getTree());

                    	    }
                    	    break;

                    	default :
                    	    break loop36;
                        }
                    } while (true);


                    }
                    break;

            }


            // AST REWRITE
            // elements: expression_list, expression, partition_key
            // token labels: 
            // rule labels: retval
            // token list labels: 
            // rule list labels: 
            // wildcard labels: 
            if ( state.backtracking==0 ) {

            retval.tree = root_0;
            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

            root_0 = (Object)adaptor.nil();
            // 303:9: -> ^( partition_key ( expression_list )? ( EXPR expression )* )
            {
                // PLSQL_DMLParser.g:303:12: ^( partition_key ( expression_list )? ( EXPR expression )* )
                {
                Object root_1 = (Object)adaptor.nil();
                root_1 = (Object)adaptor.becomeRoot(stream_partition_key.nextNode(), root_1);

                // PLSQL_DMLParser.g:303:28: ( expression_list )?
                if ( stream_expression_list.hasNext() ) {
                    adaptor.addChild(root_1, stream_expression_list.nextTree());

                }
                stream_expression_list.reset();

                // PLSQL_DMLParser.g:303:45: ( EXPR expression )*
                while ( stream_expression.hasNext() ) {
                    adaptor.addChild(root_1, 
                    (Object)adaptor.create(EXPR, "EXPR")
                    );

                    adaptor.addChild(root_1, stream_expression.nextTree());

                }
                stream_expression.reset();

                adaptor.addChild(root_0, root_1);
                }

            }


            retval.tree = root_0;
            }

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "query_partition_clause"


    public static class flashback_query_clause_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "flashback_query_clause"
    // PLSQL_DMLParser.g:306:1: flashback_query_clause : ( versions_key between_key ( scn_key | timestamp_key ) expression -> ^( versions_key ( scn_key )? ( timestamp_key )? ^( EXPR expression ) ) | as_key of_key ( scn_key | timestamp_key ) expression -> ^( as_key ( scn_key )? ( timestamp_key )? ^( EXPR expression ) ) );
    public final PLSQLParser_PLSQL_DMLParser.flashback_query_clause_return flashback_query_clause() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.flashback_query_clause_return retval = new PLSQLParser_PLSQL_DMLParser.flashback_query_clause_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        PLSQLParser_PLSQLKeys.versions_key_return versions_key98 =null;

        PLSQLParser_PLSQLKeys.between_key_return between_key99 =null;

        PLSQLParser_PLSQLKeys.scn_key_return scn_key100 =null;

        PLSQLParser_PLSQLKeys.timestamp_key_return timestamp_key101 =null;

        PLSQLParser_PLSQL_DMLParser.expression_return expression102 =null;

        PLSQLParser_PLSQLKeys.as_key_return as_key103 =null;

        PLSQLParser_PLSQLKeys.of_key_return of_key104 =null;

        PLSQLParser_PLSQLKeys.scn_key_return scn_key105 =null;

        PLSQLParser_PLSQLKeys.timestamp_key_return timestamp_key106 =null;

        PLSQLParser_PLSQL_DMLParser.expression_return expression107 =null;


        RewriteRuleSubtreeStream stream_expression=new RewriteRuleSubtreeStream(adaptor,"rule expression");
        RewriteRuleSubtreeStream stream_scn_key=new RewriteRuleSubtreeStream(adaptor,"rule scn_key");
        RewriteRuleSubtreeStream stream_versions_key=new RewriteRuleSubtreeStream(adaptor,"rule versions_key");
        RewriteRuleSubtreeStream stream_between_key=new RewriteRuleSubtreeStream(adaptor,"rule between_key");
        RewriteRuleSubtreeStream stream_as_key=new RewriteRuleSubtreeStream(adaptor,"rule as_key");
        RewriteRuleSubtreeStream stream_timestamp_key=new RewriteRuleSubtreeStream(adaptor,"rule timestamp_key");
        RewriteRuleSubtreeStream stream_of_key=new RewriteRuleSubtreeStream(adaptor,"rule of_key");
        try {
            // PLSQL_DMLParser.g:307:5: ( versions_key between_key ( scn_key | timestamp_key ) expression -> ^( versions_key ( scn_key )? ( timestamp_key )? ^( EXPR expression ) ) | as_key of_key ( scn_key | timestamp_key ) expression -> ^( as_key ( scn_key )? ( timestamp_key )? ^( EXPR expression ) ) )
            int alt40=2;
            int LA40_0 = input.LA(1);

            if ( (LA40_0==REGULAR_ID) && ((input.LT(1).getText().equalsIgnoreCase("versions")))) {
                alt40=1;
            }
            else if ( (LA40_0==SQL92_RESERVED_AS) ) {
                alt40=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return retval;}
                NoViableAltException nvae =
                    new NoViableAltException("", 40, 0, input);

                throw nvae;

            }
            switch (alt40) {
                case 1 :
                    // PLSQL_DMLParser.g:307:10: versions_key between_key ( scn_key | timestamp_key ) expression
                    {
                    pushFollow(FOLLOW_versions_key_in_flashback_query_clause1935);
                    versions_key98=gPLSQLParser.versions_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_versions_key.add(versions_key98.getTree());

                    pushFollow(FOLLOW_between_key_in_flashback_query_clause1937);
                    between_key99=gPLSQLParser.between_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_between_key.add(between_key99.getTree());

                    // PLSQL_DMLParser.g:307:35: ( scn_key | timestamp_key )
                    int alt38=2;
                    int LA38_0 = input.LA(1);

                    if ( (LA38_0==REGULAR_ID) ) {
                        int LA38_1 = input.LA(2);

                        if ( ((input.LT(1).getText().equalsIgnoreCase("scn"))) ) {
                            alt38=1;
                        }
                        else if ( ((input.LT(1).getText().equalsIgnoreCase("timestamp"))) ) {
                            alt38=2;
                        }
                        else {
                            if (state.backtracking>0) {state.failed=true; return retval;}
                            NoViableAltException nvae =
                                new NoViableAltException("", 38, 1, input);

                            throw nvae;

                        }
                    }
                    else {
                        if (state.backtracking>0) {state.failed=true; return retval;}
                        NoViableAltException nvae =
                            new NoViableAltException("", 38, 0, input);

                        throw nvae;

                    }
                    switch (alt38) {
                        case 1 :
                            // PLSQL_DMLParser.g:307:36: scn_key
                            {
                            pushFollow(FOLLOW_scn_key_in_flashback_query_clause1940);
                            scn_key100=gPLSQLParser.scn_key();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) stream_scn_key.add(scn_key100.getTree());

                            }
                            break;
                        case 2 :
                            // PLSQL_DMLParser.g:307:44: timestamp_key
                            {
                            pushFollow(FOLLOW_timestamp_key_in_flashback_query_clause1942);
                            timestamp_key101=gPLSQLParser.timestamp_key();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) stream_timestamp_key.add(timestamp_key101.getTree());

                            }
                            break;

                    }


                    pushFollow(FOLLOW_expression_in_flashback_query_clause1945);
                    expression102=expression();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_expression.add(expression102.getTree());

                    // AST REWRITE
                    // elements: timestamp_key, expression, scn_key, versions_key
                    // token labels: 
                    // rule labels: retval
                    // token list labels: 
                    // rule list labels: 
                    // wildcard labels: 
                    if ( state.backtracking==0 ) {

                    retval.tree = root_0;
                    RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

                    root_0 = (Object)adaptor.nil();
                    // 307:70: -> ^( versions_key ( scn_key )? ( timestamp_key )? ^( EXPR expression ) )
                    {
                        // PLSQL_DMLParser.g:307:73: ^( versions_key ( scn_key )? ( timestamp_key )? ^( EXPR expression ) )
                        {
                        Object root_1 = (Object)adaptor.nil();
                        root_1 = (Object)adaptor.becomeRoot(stream_versions_key.nextNode(), root_1);

                        // PLSQL_DMLParser.g:307:88: ( scn_key )?
                        if ( stream_scn_key.hasNext() ) {
                            adaptor.addChild(root_1, stream_scn_key.nextTree());

                        }
                        stream_scn_key.reset();

                        // PLSQL_DMLParser.g:307:97: ( timestamp_key )?
                        if ( stream_timestamp_key.hasNext() ) {
                            adaptor.addChild(root_1, stream_timestamp_key.nextTree());

                        }
                        stream_timestamp_key.reset();

                        // PLSQL_DMLParser.g:307:112: ^( EXPR expression )
                        {
                        Object root_2 = (Object)adaptor.nil();
                        root_2 = (Object)adaptor.becomeRoot(
                        (Object)adaptor.create(EXPR, "EXPR")
                        , root_2);

                        adaptor.addChild(root_2, stream_expression.nextTree());

                        adaptor.addChild(root_1, root_2);
                        }

                        adaptor.addChild(root_0, root_1);
                        }

                    }


                    retval.tree = root_0;
                    }

                    }
                    break;
                case 2 :
                    // PLSQL_DMLParser.g:308:10: as_key of_key ( scn_key | timestamp_key ) expression
                    {
                    pushFollow(FOLLOW_as_key_in_flashback_query_clause1975);
                    as_key103=gPLSQLParser.as_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_as_key.add(as_key103.getTree());

                    pushFollow(FOLLOW_of_key_in_flashback_query_clause1977);
                    of_key104=gPLSQLParser.of_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_of_key.add(of_key104.getTree());

                    // PLSQL_DMLParser.g:308:24: ( scn_key | timestamp_key )
                    int alt39=2;
                    int LA39_0 = input.LA(1);

                    if ( (LA39_0==REGULAR_ID) ) {
                        int LA39_1 = input.LA(2);

                        if ( ((input.LT(1).getText().equalsIgnoreCase("scn"))) ) {
                            alt39=1;
                        }
                        else if ( ((input.LT(1).getText().equalsIgnoreCase("timestamp"))) ) {
                            alt39=2;
                        }
                        else {
                            if (state.backtracking>0) {state.failed=true; return retval;}
                            NoViableAltException nvae =
                                new NoViableAltException("", 39, 1, input);

                            throw nvae;

                        }
                    }
                    else {
                        if (state.backtracking>0) {state.failed=true; return retval;}
                        NoViableAltException nvae =
                            new NoViableAltException("", 39, 0, input);

                        throw nvae;

                    }
                    switch (alt39) {
                        case 1 :
                            // PLSQL_DMLParser.g:308:25: scn_key
                            {
                            pushFollow(FOLLOW_scn_key_in_flashback_query_clause1980);
                            scn_key105=gPLSQLParser.scn_key();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) stream_scn_key.add(scn_key105.getTree());

                            }
                            break;
                        case 2 :
                            // PLSQL_DMLParser.g:308:33: timestamp_key
                            {
                            pushFollow(FOLLOW_timestamp_key_in_flashback_query_clause1982);
                            timestamp_key106=gPLSQLParser.timestamp_key();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) stream_timestamp_key.add(timestamp_key106.getTree());

                            }
                            break;

                    }


                    pushFollow(FOLLOW_expression_in_flashback_query_clause1985);
                    expression107=expression();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_expression.add(expression107.getTree());

                    // AST REWRITE
                    // elements: timestamp_key, scn_key, expression, as_key
                    // token labels: 
                    // rule labels: retval
                    // token list labels: 
                    // rule list labels: 
                    // wildcard labels: 
                    if ( state.backtracking==0 ) {

                    retval.tree = root_0;
                    RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

                    root_0 = (Object)adaptor.nil();
                    // 308:59: -> ^( as_key ( scn_key )? ( timestamp_key )? ^( EXPR expression ) )
                    {
                        // PLSQL_DMLParser.g:308:62: ^( as_key ( scn_key )? ( timestamp_key )? ^( EXPR expression ) )
                        {
                        Object root_1 = (Object)adaptor.nil();
                        root_1 = (Object)adaptor.becomeRoot(stream_as_key.nextNode(), root_1);

                        // PLSQL_DMLParser.g:308:71: ( scn_key )?
                        if ( stream_scn_key.hasNext() ) {
                            adaptor.addChild(root_1, stream_scn_key.nextTree());

                        }
                        stream_scn_key.reset();

                        // PLSQL_DMLParser.g:308:80: ( timestamp_key )?
                        if ( stream_timestamp_key.hasNext() ) {
                            adaptor.addChild(root_1, stream_timestamp_key.nextTree());

                        }
                        stream_timestamp_key.reset();

                        // PLSQL_DMLParser.g:308:95: ^( EXPR expression )
                        {
                        Object root_2 = (Object)adaptor.nil();
                        root_2 = (Object)adaptor.becomeRoot(
                        (Object)adaptor.create(EXPR, "EXPR")
                        , root_2);

                        adaptor.addChild(root_2, stream_expression.nextTree());

                        adaptor.addChild(root_1, root_2);
                        }

                        adaptor.addChild(root_0, root_1);
                        }

                    }


                    retval.tree = root_0;
                    }

                    }
                    break;

            }
            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "flashback_query_clause"


    public static class pivot_clause_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "pivot_clause"
    // PLSQL_DMLParser.g:311:1: pivot_clause : pivot_key ( xml_key )? LEFT_PAREN pivot_element ( COMMA pivot_element )* pivot_for_clause pivot_in_clause RIGHT_PAREN -> ^( pivot_key ( xml_key )? ( pivot_element )+ pivot_for_clause pivot_in_clause ) ;
    public final PLSQLParser_PLSQL_DMLParser.pivot_clause_return pivot_clause() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.pivot_clause_return retval = new PLSQLParser_PLSQL_DMLParser.pivot_clause_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token LEFT_PAREN110=null;
        Token COMMA112=null;
        Token RIGHT_PAREN116=null;
        PLSQLParser_PLSQLKeys.pivot_key_return pivot_key108 =null;

        PLSQLParser_PLSQLKeys.xml_key_return xml_key109 =null;

        PLSQLParser_PLSQL_DMLParser.pivot_element_return pivot_element111 =null;

        PLSQLParser_PLSQL_DMLParser.pivot_element_return pivot_element113 =null;

        PLSQLParser_PLSQL_DMLParser.pivot_for_clause_return pivot_for_clause114 =null;

        PLSQLParser_PLSQL_DMLParser.pivot_in_clause_return pivot_in_clause115 =null;


        Object LEFT_PAREN110_tree=null;
        Object COMMA112_tree=null;
        Object RIGHT_PAREN116_tree=null;
        RewriteRuleTokenStream stream_LEFT_PAREN=new RewriteRuleTokenStream(adaptor,"token LEFT_PAREN");
        RewriteRuleTokenStream stream_RIGHT_PAREN=new RewriteRuleTokenStream(adaptor,"token RIGHT_PAREN");
        RewriteRuleTokenStream stream_COMMA=new RewriteRuleTokenStream(adaptor,"token COMMA");
        RewriteRuleSubtreeStream stream_pivot_in_clause=new RewriteRuleSubtreeStream(adaptor,"rule pivot_in_clause");
        RewriteRuleSubtreeStream stream_pivot_element=new RewriteRuleSubtreeStream(adaptor,"rule pivot_element");
        RewriteRuleSubtreeStream stream_pivot_key=new RewriteRuleSubtreeStream(adaptor,"rule pivot_key");
        RewriteRuleSubtreeStream stream_pivot_for_clause=new RewriteRuleSubtreeStream(adaptor,"rule pivot_for_clause");
        RewriteRuleSubtreeStream stream_xml_key=new RewriteRuleSubtreeStream(adaptor,"rule xml_key");
        try {
            // PLSQL_DMLParser.g:312:5: ( pivot_key ( xml_key )? LEFT_PAREN pivot_element ( COMMA pivot_element )* pivot_for_clause pivot_in_clause RIGHT_PAREN -> ^( pivot_key ( xml_key )? ( pivot_element )+ pivot_for_clause pivot_in_clause ) )
            // PLSQL_DMLParser.g:312:10: pivot_key ( xml_key )? LEFT_PAREN pivot_element ( COMMA pivot_element )* pivot_for_clause pivot_in_clause RIGHT_PAREN
            {
            pushFollow(FOLLOW_pivot_key_in_pivot_clause2023);
            pivot_key108=gPLSQLParser.pivot_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_pivot_key.add(pivot_key108.getTree());

            // PLSQL_DMLParser.g:312:20: ( xml_key )?
            int alt41=2;
            int LA41_0 = input.LA(1);

            if ( (LA41_0==REGULAR_ID) && ((input.LT(1).getText().equalsIgnoreCase("xml")))) {
                alt41=1;
            }
            switch (alt41) {
                case 1 :
                    // PLSQL_DMLParser.g:312:20: xml_key
                    {
                    pushFollow(FOLLOW_xml_key_in_pivot_clause2025);
                    xml_key109=gPLSQLParser.xml_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_xml_key.add(xml_key109.getTree());

                    }
                    break;

            }


            LEFT_PAREN110=(Token)match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_pivot_clause2036); if (state.failed) return retval; 
            if ( state.backtracking==0 ) stream_LEFT_PAREN.add(LEFT_PAREN110);


            pushFollow(FOLLOW_pivot_element_in_pivot_clause2050);
            pivot_element111=pivot_element();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_pivot_element.add(pivot_element111.getTree());

            // PLSQL_DMLParser.g:314:27: ( COMMA pivot_element )*
            loop42:
            do {
                int alt42=2;
                int LA42_0 = input.LA(1);

                if ( (LA42_0==COMMA) ) {
                    alt42=1;
                }


                switch (alt42) {
            	case 1 :
            	    // PLSQL_DMLParser.g:314:28: COMMA pivot_element
            	    {
            	    COMMA112=(Token)match(input,COMMA,FOLLOW_COMMA_in_pivot_clause2053); if (state.failed) return retval; 
            	    if ( state.backtracking==0 ) stream_COMMA.add(COMMA112);


            	    pushFollow(FOLLOW_pivot_element_in_pivot_clause2055);
            	    pivot_element113=pivot_element();

            	    state._fsp--;
            	    if (state.failed) return retval;
            	    if ( state.backtracking==0 ) stream_pivot_element.add(pivot_element113.getTree());

            	    }
            	    break;

            	default :
            	    break loop42;
                }
            } while (true);


            pushFollow(FOLLOW_pivot_for_clause_in_pivot_clause2071);
            pivot_for_clause114=pivot_for_clause();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_pivot_for_clause.add(pivot_for_clause114.getTree());

            pushFollow(FOLLOW_pivot_in_clause_in_pivot_clause2085);
            pivot_in_clause115=pivot_in_clause();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_pivot_in_clause.add(pivot_in_clause115.getTree());

            RIGHT_PAREN116=(Token)match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_pivot_clause2097); if (state.failed) return retval; 
            if ( state.backtracking==0 ) stream_RIGHT_PAREN.add(RIGHT_PAREN116);


            // AST REWRITE
            // elements: pivot_key, pivot_for_clause, pivot_element, pivot_in_clause, xml_key
            // token labels: 
            // rule labels: retval
            // token list labels: 
            // rule list labels: 
            // wildcard labels: 
            if ( state.backtracking==0 ) {

            retval.tree = root_0;
            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

            root_0 = (Object)adaptor.nil();
            // 318:9: -> ^( pivot_key ( xml_key )? ( pivot_element )+ pivot_for_clause pivot_in_clause )
            {
                // PLSQL_DMLParser.g:318:12: ^( pivot_key ( xml_key )? ( pivot_element )+ pivot_for_clause pivot_in_clause )
                {
                Object root_1 = (Object)adaptor.nil();
                root_1 = (Object)adaptor.becomeRoot(stream_pivot_key.nextNode(), root_1);

                // PLSQL_DMLParser.g:318:24: ( xml_key )?
                if ( stream_xml_key.hasNext() ) {
                    adaptor.addChild(root_1, stream_xml_key.nextTree());

                }
                stream_xml_key.reset();

                if ( !(stream_pivot_element.hasNext()) ) {
                    throw new RewriteEarlyExitException();
                }
                while ( stream_pivot_element.hasNext() ) {
                    adaptor.addChild(root_1, stream_pivot_element.nextTree());

                }
                stream_pivot_element.reset();

                adaptor.addChild(root_1, stream_pivot_for_clause.nextTree());

                adaptor.addChild(root_1, stream_pivot_in_clause.nextTree());

                adaptor.addChild(root_0, root_1);
                }

            }


            retval.tree = root_0;
            }

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "pivot_clause"


    public static class pivot_element_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "pivot_element"
    // PLSQL_DMLParser.g:321:1: pivot_element : aggregate_function_name LEFT_PAREN expression RIGHT_PAREN ( alias )? -> ^( PIVOT_ELEMENT ( alias )? ^( EXPR ^( ROUTINE_CALL aggregate_function_name ^( ARGUMENTS ^( ARGUMENT ^( EXPR expression ) ) ) ) ) ) ;
    public final PLSQLParser_PLSQL_DMLParser.pivot_element_return pivot_element() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.pivot_element_return retval = new PLSQLParser_PLSQL_DMLParser.pivot_element_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token LEFT_PAREN118=null;
        Token RIGHT_PAREN120=null;
        PLSQLParser_PLSQLCommons.aggregate_function_name_return aggregate_function_name117 =null;

        PLSQLParser_PLSQL_DMLParser.expression_return expression119 =null;

        PLSQLParser_PLSQLCommons.alias_return alias121 =null;


        Object LEFT_PAREN118_tree=null;
        Object RIGHT_PAREN120_tree=null;
        RewriteRuleTokenStream stream_LEFT_PAREN=new RewriteRuleTokenStream(adaptor,"token LEFT_PAREN");
        RewriteRuleTokenStream stream_RIGHT_PAREN=new RewriteRuleTokenStream(adaptor,"token RIGHT_PAREN");
        RewriteRuleSubtreeStream stream_expression=new RewriteRuleSubtreeStream(adaptor,"rule expression");
        RewriteRuleSubtreeStream stream_alias=new RewriteRuleSubtreeStream(adaptor,"rule alias");
        RewriteRuleSubtreeStream stream_aggregate_function_name=new RewriteRuleSubtreeStream(adaptor,"rule aggregate_function_name");
        try {
            // PLSQL_DMLParser.g:322:5: ( aggregate_function_name LEFT_PAREN expression RIGHT_PAREN ( alias )? -> ^( PIVOT_ELEMENT ( alias )? ^( EXPR ^( ROUTINE_CALL aggregate_function_name ^( ARGUMENTS ^( ARGUMENT ^( EXPR expression ) ) ) ) ) ) )
            // PLSQL_DMLParser.g:322:10: aggregate_function_name LEFT_PAREN expression RIGHT_PAREN ( alias )?
            {
            pushFollow(FOLLOW_aggregate_function_name_in_pivot_element2141);
            aggregate_function_name117=gPLSQLParser.aggregate_function_name();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_aggregate_function_name.add(aggregate_function_name117.getTree());

            LEFT_PAREN118=(Token)match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_pivot_element2143); if (state.failed) return retval; 
            if ( state.backtracking==0 ) stream_LEFT_PAREN.add(LEFT_PAREN118);


            pushFollow(FOLLOW_expression_in_pivot_element2145);
            expression119=expression();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_expression.add(expression119.getTree());

            RIGHT_PAREN120=(Token)match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_pivot_element2147); if (state.failed) return retval; 
            if ( state.backtracking==0 ) stream_RIGHT_PAREN.add(RIGHT_PAREN120);


            // PLSQL_DMLParser.g:322:68: ( alias )?
            int alt43=2;
            int LA43_0 = input.LA(1);

            if ( (LA43_0==CHAR_STRING||LA43_0==DELIMITED_ID||LA43_0==INTRODUCER||LA43_0==REGULAR_ID||LA43_0==SQL92_RESERVED_AS) ) {
                alt43=1;
            }
            switch (alt43) {
                case 1 :
                    // PLSQL_DMLParser.g:322:68: alias
                    {
                    pushFollow(FOLLOW_alias_in_pivot_element2149);
                    alias121=gPLSQLParser.alias();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_alias.add(alias121.getTree());

                    }
                    break;

            }


            // AST REWRITE
            // elements: expression, aggregate_function_name, alias
            // token labels: 
            // rule labels: retval
            // token list labels: 
            // rule list labels: 
            // wildcard labels: 
            if ( state.backtracking==0 ) {

            retval.tree = root_0;
            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

            root_0 = (Object)adaptor.nil();
            // 323:9: -> ^( PIVOT_ELEMENT ( alias )? ^( EXPR ^( ROUTINE_CALL aggregate_function_name ^( ARGUMENTS ^( ARGUMENT ^( EXPR expression ) ) ) ) ) )
            {
                // PLSQL_DMLParser.g:323:12: ^( PIVOT_ELEMENT ( alias )? ^( EXPR ^( ROUTINE_CALL aggregate_function_name ^( ARGUMENTS ^( ARGUMENT ^( EXPR expression ) ) ) ) ) )
                {
                Object root_1 = (Object)adaptor.nil();
                root_1 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(PIVOT_ELEMENT, "PIVOT_ELEMENT")
                , root_1);

                // PLSQL_DMLParser.g:323:28: ( alias )?
                if ( stream_alias.hasNext() ) {
                    adaptor.addChild(root_1, stream_alias.nextTree());

                }
                stream_alias.reset();

                // PLSQL_DMLParser.g:323:35: ^( EXPR ^( ROUTINE_CALL aggregate_function_name ^( ARGUMENTS ^( ARGUMENT ^( EXPR expression ) ) ) ) )
                {
                Object root_2 = (Object)adaptor.nil();
                root_2 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(EXPR, "EXPR")
                , root_2);

                // PLSQL_DMLParser.g:323:42: ^( ROUTINE_CALL aggregate_function_name ^( ARGUMENTS ^( ARGUMENT ^( EXPR expression ) ) ) )
                {
                Object root_3 = (Object)adaptor.nil();
                root_3 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(ROUTINE_CALL, "ROUTINE_CALL")
                , root_3);

                adaptor.addChild(root_3, stream_aggregate_function_name.nextTree());

                // PLSQL_DMLParser.g:323:81: ^( ARGUMENTS ^( ARGUMENT ^( EXPR expression ) ) )
                {
                Object root_4 = (Object)adaptor.nil();
                root_4 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(ARGUMENTS, "ARGUMENTS")
                , root_4);

                // PLSQL_DMLParser.g:323:93: ^( ARGUMENT ^( EXPR expression ) )
                {
                Object root_5 = (Object)adaptor.nil();
                root_5 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(ARGUMENT, "ARGUMENT")
                , root_5);

                // PLSQL_DMLParser.g:323:104: ^( EXPR expression )
                {
                Object root_6 = (Object)adaptor.nil();
                root_6 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(EXPR, "EXPR")
                , root_6);

                adaptor.addChild(root_6, stream_expression.nextTree());

                adaptor.addChild(root_5, root_6);
                }

                adaptor.addChild(root_4, root_5);
                }

                adaptor.addChild(root_3, root_4);
                }

                adaptor.addChild(root_2, root_3);
                }

                adaptor.addChild(root_1, root_2);
                }

                adaptor.addChild(root_0, root_1);
                }

            }


            retval.tree = root_0;
            }

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "pivot_element"


    public static class pivot_for_clause_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "pivot_for_clause"
    // PLSQL_DMLParser.g:326:1: pivot_for_clause : for_key ( column_name | LEFT_PAREN column_name ( COMMA column_name )* RIGHT_PAREN ) -> ^( for_key ( column_name )+ ) ;
    public final PLSQLParser_PLSQL_DMLParser.pivot_for_clause_return pivot_for_clause() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.pivot_for_clause_return retval = new PLSQLParser_PLSQL_DMLParser.pivot_for_clause_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token LEFT_PAREN124=null;
        Token COMMA126=null;
        Token RIGHT_PAREN128=null;
        PLSQLParser_PLSQLKeys.for_key_return for_key122 =null;

        PLSQLParser_PLSQLCommons.column_name_return column_name123 =null;

        PLSQLParser_PLSQLCommons.column_name_return column_name125 =null;

        PLSQLParser_PLSQLCommons.column_name_return column_name127 =null;


        Object LEFT_PAREN124_tree=null;
        Object COMMA126_tree=null;
        Object RIGHT_PAREN128_tree=null;
        RewriteRuleTokenStream stream_LEFT_PAREN=new RewriteRuleTokenStream(adaptor,"token LEFT_PAREN");
        RewriteRuleTokenStream stream_RIGHT_PAREN=new RewriteRuleTokenStream(adaptor,"token RIGHT_PAREN");
        RewriteRuleTokenStream stream_COMMA=new RewriteRuleTokenStream(adaptor,"token COMMA");
        RewriteRuleSubtreeStream stream_column_name=new RewriteRuleSubtreeStream(adaptor,"rule column_name");
        RewriteRuleSubtreeStream stream_for_key=new RewriteRuleSubtreeStream(adaptor,"rule for_key");
        try {
            // PLSQL_DMLParser.g:327:5: ( for_key ( column_name | LEFT_PAREN column_name ( COMMA column_name )* RIGHT_PAREN ) -> ^( for_key ( column_name )+ ) )
            // PLSQL_DMLParser.g:327:10: for_key ( column_name | LEFT_PAREN column_name ( COMMA column_name )* RIGHT_PAREN )
            {
            pushFollow(FOLLOW_for_key_in_pivot_for_clause2211);
            for_key122=gPLSQLParser.for_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_for_key.add(for_key122.getTree());

            // PLSQL_DMLParser.g:328:5: ( column_name | LEFT_PAREN column_name ( COMMA column_name )* RIGHT_PAREN )
            int alt45=2;
            int LA45_0 = input.LA(1);

            if ( (LA45_0==DELIMITED_ID||LA45_0==INTRODUCER||LA45_0==REGULAR_ID) ) {
                alt45=1;
            }
            else if ( (LA45_0==LEFT_PAREN) ) {
                alt45=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return retval;}
                NoViableAltException nvae =
                    new NoViableAltException("", 45, 0, input);

                throw nvae;

            }
            switch (alt45) {
                case 1 :
                    // PLSQL_DMLParser.g:328:10: column_name
                    {
                    pushFollow(FOLLOW_column_name_in_pivot_for_clause2223);
                    column_name123=gPLSQLParser.column_name();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_column_name.add(column_name123.getTree());

                    }
                    break;
                case 2 :
                    // PLSQL_DMLParser.g:329:10: LEFT_PAREN column_name ( COMMA column_name )* RIGHT_PAREN
                    {
                    LEFT_PAREN124=(Token)match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_pivot_for_clause2234); if (state.failed) return retval; 
                    if ( state.backtracking==0 ) stream_LEFT_PAREN.add(LEFT_PAREN124);


                    pushFollow(FOLLOW_column_name_in_pivot_for_clause2236);
                    column_name125=gPLSQLParser.column_name();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_column_name.add(column_name125.getTree());

                    // PLSQL_DMLParser.g:329:33: ( COMMA column_name )*
                    loop44:
                    do {
                        int alt44=2;
                        int LA44_0 = input.LA(1);

                        if ( (LA44_0==COMMA) ) {
                            alt44=1;
                        }


                        switch (alt44) {
                    	case 1 :
                    	    // PLSQL_DMLParser.g:329:34: COMMA column_name
                    	    {
                    	    COMMA126=(Token)match(input,COMMA,FOLLOW_COMMA_in_pivot_for_clause2239); if (state.failed) return retval; 
                    	    if ( state.backtracking==0 ) stream_COMMA.add(COMMA126);


                    	    pushFollow(FOLLOW_column_name_in_pivot_for_clause2241);
                    	    column_name127=gPLSQLParser.column_name();

                    	    state._fsp--;
                    	    if (state.failed) return retval;
                    	    if ( state.backtracking==0 ) stream_column_name.add(column_name127.getTree());

                    	    }
                    	    break;

                    	default :
                    	    break loop44;
                        }
                    } while (true);


                    RIGHT_PAREN128=(Token)match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_pivot_for_clause2245); if (state.failed) return retval; 
                    if ( state.backtracking==0 ) stream_RIGHT_PAREN.add(RIGHT_PAREN128);


                    }
                    break;

            }


            // AST REWRITE
            // elements: column_name, for_key
            // token labels: 
            // rule labels: retval
            // token list labels: 
            // rule list labels: 
            // wildcard labels: 
            if ( state.backtracking==0 ) {

            retval.tree = root_0;
            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

            root_0 = (Object)adaptor.nil();
            // 331:9: -> ^( for_key ( column_name )+ )
            {
                // PLSQL_DMLParser.g:331:12: ^( for_key ( column_name )+ )
                {
                Object root_1 = (Object)adaptor.nil();
                root_1 = (Object)adaptor.becomeRoot(stream_for_key.nextNode(), root_1);

                if ( !(stream_column_name.hasNext()) ) {
                    throw new RewriteEarlyExitException();
                }
                while ( stream_column_name.hasNext() ) {
                    adaptor.addChild(root_1, stream_column_name.nextTree());

                }
                stream_column_name.reset();

                adaptor.addChild(root_0, root_1);
                }

            }


            retval.tree = root_0;
            }

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "pivot_for_clause"


    public static class pivot_in_clause_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "pivot_in_clause"
    // PLSQL_DMLParser.g:334:1: pivot_in_clause : in_key LEFT_PAREN ( ( select_key )=> subquery | ( any_key )=> any_key ( COMMA any_key )* | pivot_in_clause_element ( COMMA pivot_in_clause_element )* ) RIGHT_PAREN -> {mode == 1}? ^( in_key subquery ) -> {mode == 2}? ^( in_key ^( ANY_MODE ( any_key )+ ) ) -> ^( in_key ^( ELEMENTS_MODE ( pivot_in_clause_element )+ ) ) ;
    public final PLSQLParser_PLSQL_DMLParser.pivot_in_clause_return pivot_in_clause() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.pivot_in_clause_return retval = new PLSQLParser_PLSQL_DMLParser.pivot_in_clause_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token LEFT_PAREN130=null;
        Token COMMA133=null;
        Token COMMA136=null;
        Token RIGHT_PAREN138=null;
        PLSQLParser_PLSQLKeys.in_key_return in_key129 =null;

        PLSQLParser_PLSQL_DMLParser.subquery_return subquery131 =null;

        PLSQLParser_PLSQLKeys.any_key_return any_key132 =null;

        PLSQLParser_PLSQLKeys.any_key_return any_key134 =null;

        PLSQLParser_PLSQL_DMLParser.pivot_in_clause_element_return pivot_in_clause_element135 =null;

        PLSQLParser_PLSQL_DMLParser.pivot_in_clause_element_return pivot_in_clause_element137 =null;


        Object LEFT_PAREN130_tree=null;
        Object COMMA133_tree=null;
        Object COMMA136_tree=null;
        Object RIGHT_PAREN138_tree=null;
        RewriteRuleTokenStream stream_LEFT_PAREN=new RewriteRuleTokenStream(adaptor,"token LEFT_PAREN");
        RewriteRuleTokenStream stream_RIGHT_PAREN=new RewriteRuleTokenStream(adaptor,"token RIGHT_PAREN");
        RewriteRuleTokenStream stream_COMMA=new RewriteRuleTokenStream(adaptor,"token COMMA");
        RewriteRuleSubtreeStream stream_any_key=new RewriteRuleSubtreeStream(adaptor,"rule any_key");
        RewriteRuleSubtreeStream stream_pivot_in_clause_element=new RewriteRuleSubtreeStream(adaptor,"rule pivot_in_clause_element");
        RewriteRuleSubtreeStream stream_in_key=new RewriteRuleSubtreeStream(adaptor,"rule in_key");
        RewriteRuleSubtreeStream stream_subquery=new RewriteRuleSubtreeStream(adaptor,"rule subquery");
            int mode = 0;    
        try {
            // PLSQL_DMLParser.g:336:5: ( in_key LEFT_PAREN ( ( select_key )=> subquery | ( any_key )=> any_key ( COMMA any_key )* | pivot_in_clause_element ( COMMA pivot_in_clause_element )* ) RIGHT_PAREN -> {mode == 1}? ^( in_key subquery ) -> {mode == 2}? ^( in_key ^( ANY_MODE ( any_key )+ ) ) -> ^( in_key ^( ELEMENTS_MODE ( pivot_in_clause_element )+ ) ) )
            // PLSQL_DMLParser.g:336:10: in_key LEFT_PAREN ( ( select_key )=> subquery | ( any_key )=> any_key ( COMMA any_key )* | pivot_in_clause_element ( COMMA pivot_in_clause_element )* ) RIGHT_PAREN
            {
            pushFollow(FOLLOW_in_key_in_pivot_in_clause2296);
            in_key129=gPLSQLParser.in_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_in_key.add(in_key129.getTree());

            LEFT_PAREN130=(Token)match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_pivot_in_clause2306); if (state.failed) return retval; 
            if ( state.backtracking==0 ) stream_LEFT_PAREN.add(LEFT_PAREN130);


            // PLSQL_DMLParser.g:338:13: ( ( select_key )=> subquery | ( any_key )=> any_key ( COMMA any_key )* | pivot_in_clause_element ( COMMA pivot_in_clause_element )* )
            int alt48=3;
            int LA48_0 = input.LA(1);

            if ( (LA48_0==SQL92_RESERVED_SELECT) && (synpred5_PLSQL_DMLParser())) {
                alt48=1;
            }
            else if ( (LA48_0==LEFT_PAREN) ) {
                int LA48_2 = input.LA(2);

                if ( (synpred5_PLSQL_DMLParser()) ) {
                    alt48=1;
                }
                else if ( (true) ) {
                    alt48=3;
                }
                else {
                    if (state.backtracking>0) {state.failed=true; return retval;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 48, 2, input);

                    throw nvae;

                }
            }
            else if ( (LA48_0==SQL92_RESERVED_ANY) ) {
                int LA48_3 = input.LA(2);

                if ( (synpred6_PLSQL_DMLParser()) ) {
                    alt48=2;
                }
                else if ( (true) ) {
                    alt48=3;
                }
                else {
                    if (state.backtracking>0) {state.failed=true; return retval;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 48, 3, input);

                    throw nvae;

                }
            }
            else if ( (LA48_0==APPROXIMATE_NUM_LIT||(LA48_0 >= CHAR_STRING && LA48_0 <= COLON)||LA48_0==DELIMITED_ID||LA48_0==EXACT_NUM_LIT||LA48_0==INTRODUCER||LA48_0==MINUS_SIGN||LA48_0==PLUS_SIGN||LA48_0==REGULAR_ID||LA48_0==SQL92_RESERVED_ALL||LA48_0==SQL92_RESERVED_CASE||LA48_0==SQL92_RESERVED_DEFAULT||LA48_0==SQL92_RESERVED_DISTINCT||(LA48_0 >= SQL92_RESERVED_EXISTS && LA48_0 <= SQL92_RESERVED_FALSE)||(LA48_0 >= SQL92_RESERVED_NOT && LA48_0 <= SQL92_RESERVED_NULL)||LA48_0==SQL92_RESERVED_PRIOR||LA48_0==SQL92_RESERVED_TRUE||LA48_0==UNSIGNED_INTEGER) ) {
                alt48=3;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return retval;}
                NoViableAltException nvae =
                    new NoViableAltException("", 48, 0, input);

                throw nvae;

            }
            switch (alt48) {
                case 1 :
                    // PLSQL_DMLParser.g:338:18: ( select_key )=> subquery
                    {
                    pushFollow(FOLLOW_subquery_in_pivot_in_clause2330);
                    subquery131=subquery();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_subquery.add(subquery131.getTree());

                    if ( state.backtracking==0 ) {mode = 1;}

                    }
                    break;
                case 2 :
                    // PLSQL_DMLParser.g:339:18: ( any_key )=> any_key ( COMMA any_key )*
                    {
                    pushFollow(FOLLOW_any_key_in_pivot_in_clause2356);
                    any_key132=gPLSQLParser.any_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_any_key.add(any_key132.getTree());

                    // PLSQL_DMLParser.g:339:38: ( COMMA any_key )*
                    loop46:
                    do {
                        int alt46=2;
                        int LA46_0 = input.LA(1);

                        if ( (LA46_0==COMMA) ) {
                            alt46=1;
                        }


                        switch (alt46) {
                    	case 1 :
                    	    // PLSQL_DMLParser.g:339:39: COMMA any_key
                    	    {
                    	    COMMA133=(Token)match(input,COMMA,FOLLOW_COMMA_in_pivot_in_clause2359); if (state.failed) return retval; 
                    	    if ( state.backtracking==0 ) stream_COMMA.add(COMMA133);


                    	    pushFollow(FOLLOW_any_key_in_pivot_in_clause2361);
                    	    any_key134=gPLSQLParser.any_key();

                    	    state._fsp--;
                    	    if (state.failed) return retval;
                    	    if ( state.backtracking==0 ) stream_any_key.add(any_key134.getTree());

                    	    }
                    	    break;

                    	default :
                    	    break loop46;
                        }
                    } while (true);


                    if ( state.backtracking==0 ) {mode = 1;}

                    }
                    break;
                case 3 :
                    // PLSQL_DMLParser.g:340:18: pivot_in_clause_element ( COMMA pivot_in_clause_element )*
                    {
                    pushFollow(FOLLOW_pivot_in_clause_element_in_pivot_in_clause2384);
                    pivot_in_clause_element135=pivot_in_clause_element();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_pivot_in_clause_element.add(pivot_in_clause_element135.getTree());

                    // PLSQL_DMLParser.g:340:42: ( COMMA pivot_in_clause_element )*
                    loop47:
                    do {
                        int alt47=2;
                        int LA47_0 = input.LA(1);

                        if ( (LA47_0==COMMA) ) {
                            alt47=1;
                        }


                        switch (alt47) {
                    	case 1 :
                    	    // PLSQL_DMLParser.g:340:43: COMMA pivot_in_clause_element
                    	    {
                    	    COMMA136=(Token)match(input,COMMA,FOLLOW_COMMA_in_pivot_in_clause2387); if (state.failed) return retval; 
                    	    if ( state.backtracking==0 ) stream_COMMA.add(COMMA136);


                    	    pushFollow(FOLLOW_pivot_in_clause_element_in_pivot_in_clause2389);
                    	    pivot_in_clause_element137=pivot_in_clause_element();

                    	    state._fsp--;
                    	    if (state.failed) return retval;
                    	    if ( state.backtracking==0 ) stream_pivot_in_clause_element.add(pivot_in_clause_element137.getTree());

                    	    }
                    	    break;

                    	default :
                    	    break loop47;
                        }
                    } while (true);


                    }
                    break;

            }


            RIGHT_PAREN138=(Token)match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_pivot_in_clause2415); if (state.failed) return retval; 
            if ( state.backtracking==0 ) stream_RIGHT_PAREN.add(RIGHT_PAREN138);


            // AST REWRITE
            // elements: in_key, subquery, any_key, pivot_in_clause_element, in_key, in_key
            // token labels: 
            // rule labels: retval
            // token list labels: 
            // rule list labels: 
            // wildcard labels: 
            if ( state.backtracking==0 ) {

            retval.tree = root_0;
            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

            root_0 = (Object)adaptor.nil();
            // 343:9: -> {mode == 1}? ^( in_key subquery )
            if (mode == 1) {
                // PLSQL_DMLParser.g:343:24: ^( in_key subquery )
                {
                Object root_1 = (Object)adaptor.nil();
                root_1 = (Object)adaptor.becomeRoot(stream_in_key.nextNode(), root_1);

                adaptor.addChild(root_1, stream_subquery.nextTree());

                adaptor.addChild(root_0, root_1);
                }

            }

            else // 344:9: -> {mode == 2}? ^( in_key ^( ANY_MODE ( any_key )+ ) )
            if (mode == 2) {
                // PLSQL_DMLParser.g:344:24: ^( in_key ^( ANY_MODE ( any_key )+ ) )
                {
                Object root_1 = (Object)adaptor.nil();
                root_1 = (Object)adaptor.becomeRoot(stream_in_key.nextNode(), root_1);

                // PLSQL_DMLParser.g:344:33: ^( ANY_MODE ( any_key )+ )
                {
                Object root_2 = (Object)adaptor.nil();
                root_2 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(ANY_MODE, "ANY_MODE")
                , root_2);

                if ( !(stream_any_key.hasNext()) ) {
                    throw new RewriteEarlyExitException();
                }
                while ( stream_any_key.hasNext() ) {
                    adaptor.addChild(root_2, stream_any_key.nextTree());

                }
                stream_any_key.reset();

                adaptor.addChild(root_1, root_2);
                }

                adaptor.addChild(root_0, root_1);
                }

            }

            else // 345:9: -> ^( in_key ^( ELEMENTS_MODE ( pivot_in_clause_element )+ ) )
            {
                // PLSQL_DMLParser.g:345:12: ^( in_key ^( ELEMENTS_MODE ( pivot_in_clause_element )+ ) )
                {
                Object root_1 = (Object)adaptor.nil();
                root_1 = (Object)adaptor.becomeRoot(stream_in_key.nextNode(), root_1);

                // PLSQL_DMLParser.g:345:21: ^( ELEMENTS_MODE ( pivot_in_clause_element )+ )
                {
                Object root_2 = (Object)adaptor.nil();
                root_2 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(ELEMENTS_MODE, "ELEMENTS_MODE")
                , root_2);

                if ( !(stream_pivot_in_clause_element.hasNext()) ) {
                    throw new RewriteEarlyExitException();
                }
                while ( stream_pivot_in_clause_element.hasNext() ) {
                    adaptor.addChild(root_2, stream_pivot_in_clause_element.nextTree());

                }
                stream_pivot_in_clause_element.reset();

                adaptor.addChild(root_1, root_2);
                }

                adaptor.addChild(root_0, root_1);
                }

            }


            retval.tree = root_0;
            }

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "pivot_in_clause"


    public static class pivot_in_clause_element_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "pivot_in_clause_element"
    // PLSQL_DMLParser.g:348:1: pivot_in_clause_element : pivot_in_clause_elements ( alias )? -> ^( PIVOT_IN_ELEMENT ( alias )? pivot_in_clause_elements ) ;
    public final PLSQLParser_PLSQL_DMLParser.pivot_in_clause_element_return pivot_in_clause_element() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.pivot_in_clause_element_return retval = new PLSQLParser_PLSQL_DMLParser.pivot_in_clause_element_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        PLSQLParser_PLSQL_DMLParser.pivot_in_clause_elements_return pivot_in_clause_elements139 =null;

        PLSQLParser_PLSQLCommons.alias_return alias140 =null;


        RewriteRuleSubtreeStream stream_alias=new RewriteRuleSubtreeStream(adaptor,"rule alias");
        RewriteRuleSubtreeStream stream_pivot_in_clause_elements=new RewriteRuleSubtreeStream(adaptor,"rule pivot_in_clause_elements");
        try {
            // PLSQL_DMLParser.g:349:5: ( pivot_in_clause_elements ( alias )? -> ^( PIVOT_IN_ELEMENT ( alias )? pivot_in_clause_elements ) )
            // PLSQL_DMLParser.g:349:10: pivot_in_clause_elements ( alias )?
            {
            pushFollow(FOLLOW_pivot_in_clause_elements_in_pivot_in_clause_element2495);
            pivot_in_clause_elements139=pivot_in_clause_elements();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_pivot_in_clause_elements.add(pivot_in_clause_elements139.getTree());

            // PLSQL_DMLParser.g:349:35: ( alias )?
            int alt49=2;
            int LA49_0 = input.LA(1);

            if ( (LA49_0==CHAR_STRING||LA49_0==DELIMITED_ID||LA49_0==INTRODUCER||LA49_0==REGULAR_ID||LA49_0==SQL92_RESERVED_AS) ) {
                alt49=1;
            }
            switch (alt49) {
                case 1 :
                    // PLSQL_DMLParser.g:349:35: alias
                    {
                    pushFollow(FOLLOW_alias_in_pivot_in_clause_element2497);
                    alias140=gPLSQLParser.alias();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_alias.add(alias140.getTree());

                    }
                    break;

            }


            // AST REWRITE
            // elements: alias, pivot_in_clause_elements
            // token labels: 
            // rule labels: retval
            // token list labels: 
            // rule list labels: 
            // wildcard labels: 
            if ( state.backtracking==0 ) {

            retval.tree = root_0;
            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

            root_0 = (Object)adaptor.nil();
            // 350:9: -> ^( PIVOT_IN_ELEMENT ( alias )? pivot_in_clause_elements )
            {
                // PLSQL_DMLParser.g:350:12: ^( PIVOT_IN_ELEMENT ( alias )? pivot_in_clause_elements )
                {
                Object root_1 = (Object)adaptor.nil();
                root_1 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(PIVOT_IN_ELEMENT, "PIVOT_IN_ELEMENT")
                , root_1);

                // PLSQL_DMLParser.g:350:31: ( alias )?
                if ( stream_alias.hasNext() ) {
                    adaptor.addChild(root_1, stream_alias.nextTree());

                }
                stream_alias.reset();

                adaptor.addChild(root_1, stream_pivot_in_clause_elements.nextTree());

                adaptor.addChild(root_0, root_1);
                }

            }


            retval.tree = root_0;
            }

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "pivot_in_clause_element"


    public static class pivot_in_clause_elements_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "pivot_in_clause_elements"
    // PLSQL_DMLParser.g:353:1: pivot_in_clause_elements : ( expression -> ^( EXPR expression ) | ( LEFT_PAREN )=> expression_list );
    public final PLSQLParser_PLSQL_DMLParser.pivot_in_clause_elements_return pivot_in_clause_elements() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.pivot_in_clause_elements_return retval = new PLSQLParser_PLSQL_DMLParser.pivot_in_clause_elements_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        PLSQLParser_PLSQL_DMLParser.expression_return expression141 =null;

        PLSQLParser_PLSQL_DMLParser.expression_list_return expression_list142 =null;


        RewriteRuleSubtreeStream stream_expression=new RewriteRuleSubtreeStream(adaptor,"rule expression");
        try {
            // PLSQL_DMLParser.g:354:5: ( expression -> ^( EXPR expression ) | ( LEFT_PAREN )=> expression_list )
            int alt50=2;
            int LA50_0 = input.LA(1);

            if ( (LA50_0==APPROXIMATE_NUM_LIT||(LA50_0 >= CHAR_STRING && LA50_0 <= COLON)||LA50_0==DELIMITED_ID||LA50_0==EXACT_NUM_LIT||LA50_0==INTRODUCER||LA50_0==MINUS_SIGN||LA50_0==PLUS_SIGN||LA50_0==REGULAR_ID||LA50_0==SQL92_RESERVED_ALL||LA50_0==SQL92_RESERVED_ANY||LA50_0==SQL92_RESERVED_CASE||LA50_0==SQL92_RESERVED_DEFAULT||LA50_0==SQL92_RESERVED_DISTINCT||(LA50_0 >= SQL92_RESERVED_EXISTS && LA50_0 <= SQL92_RESERVED_FALSE)||(LA50_0 >= SQL92_RESERVED_NOT && LA50_0 <= SQL92_RESERVED_NULL)||LA50_0==SQL92_RESERVED_PRIOR||LA50_0==SQL92_RESERVED_TRUE||LA50_0==UNSIGNED_INTEGER) ) {
                alt50=1;
            }
            else if ( (LA50_0==LEFT_PAREN) ) {
                int LA50_20 = input.LA(2);

                if ( (true) ) {
                    alt50=1;
                }
                else if ( (synpred7_PLSQL_DMLParser()) ) {
                    alt50=2;
                }
                else {
                    if (state.backtracking>0) {state.failed=true; return retval;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 50, 20, input);

                    throw nvae;

                }
            }
            else {
                if (state.backtracking>0) {state.failed=true; return retval;}
                NoViableAltException nvae =
                    new NoViableAltException("", 50, 0, input);

                throw nvae;

            }
            switch (alt50) {
                case 1 :
                    // PLSQL_DMLParser.g:354:10: expression
                    {
                    pushFollow(FOLLOW_expression_in_pivot_in_clause_elements2537);
                    expression141=expression();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_expression.add(expression141.getTree());

                    // AST REWRITE
                    // elements: expression
                    // token labels: 
                    // rule labels: retval
                    // token list labels: 
                    // rule list labels: 
                    // wildcard labels: 
                    if ( state.backtracking==0 ) {

                    retval.tree = root_0;
                    RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

                    root_0 = (Object)adaptor.nil();
                    // 354:21: -> ^( EXPR expression )
                    {
                        // PLSQL_DMLParser.g:354:24: ^( EXPR expression )
                        {
                        Object root_1 = (Object)adaptor.nil();
                        root_1 = (Object)adaptor.becomeRoot(
                        (Object)adaptor.create(EXPR, "EXPR")
                        , root_1);

                        adaptor.addChild(root_1, stream_expression.nextTree());

                        adaptor.addChild(root_0, root_1);
                        }

                    }


                    retval.tree = root_0;
                    }

                    }
                    break;
                case 2 :
                    // PLSQL_DMLParser.g:355:10: ( LEFT_PAREN )=> expression_list
                    {
                    root_0 = (Object)adaptor.nil();


                    pushFollow(FOLLOW_expression_list_in_pivot_in_clause_elements2561);
                    expression_list142=expression_list();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, expression_list142.getTree());

                    }
                    break;

            }
            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "pivot_in_clause_elements"


    public static class unpivot_clause_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "unpivot_clause"
    // PLSQL_DMLParser.g:358:1: unpivot_clause : unpivot_key ( ( include_key | exclude_key ) nulls_key )? LEFT_PAREN ( column_name | LEFT_PAREN column_name ( COMMA column_name )* RIGHT_PAREN ) pivot_for_clause unpivot_in_clause RIGHT_PAREN -> ^( unpivot_key ( include_key )? ( exclude_key )? ( nulls_key )? ( column_name )+ pivot_for_clause unpivot_in_clause ) ;
    public final PLSQLParser_PLSQL_DMLParser.unpivot_clause_return unpivot_clause() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.unpivot_clause_return retval = new PLSQLParser_PLSQL_DMLParser.unpivot_clause_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token LEFT_PAREN147=null;
        Token LEFT_PAREN149=null;
        Token COMMA151=null;
        Token RIGHT_PAREN153=null;
        Token RIGHT_PAREN156=null;
        PLSQLParser_PLSQLKeys.unpivot_key_return unpivot_key143 =null;

        PLSQLParser_PLSQLKeys.include_key_return include_key144 =null;

        PLSQLParser_PLSQLKeys.exclude_key_return exclude_key145 =null;

        PLSQLParser_PLSQLKeys.nulls_key_return nulls_key146 =null;

        PLSQLParser_PLSQLCommons.column_name_return column_name148 =null;

        PLSQLParser_PLSQLCommons.column_name_return column_name150 =null;

        PLSQLParser_PLSQLCommons.column_name_return column_name152 =null;

        PLSQLParser_PLSQL_DMLParser.pivot_for_clause_return pivot_for_clause154 =null;

        PLSQLParser_PLSQL_DMLParser.unpivot_in_clause_return unpivot_in_clause155 =null;


        Object LEFT_PAREN147_tree=null;
        Object LEFT_PAREN149_tree=null;
        Object COMMA151_tree=null;
        Object RIGHT_PAREN153_tree=null;
        Object RIGHT_PAREN156_tree=null;
        RewriteRuleTokenStream stream_LEFT_PAREN=new RewriteRuleTokenStream(adaptor,"token LEFT_PAREN");
        RewriteRuleTokenStream stream_RIGHT_PAREN=new RewriteRuleTokenStream(adaptor,"token RIGHT_PAREN");
        RewriteRuleTokenStream stream_COMMA=new RewriteRuleTokenStream(adaptor,"token COMMA");
        RewriteRuleSubtreeStream stream_nulls_key=new RewriteRuleSubtreeStream(adaptor,"rule nulls_key");
        RewriteRuleSubtreeStream stream_exclude_key=new RewriteRuleSubtreeStream(adaptor,"rule exclude_key");
        RewriteRuleSubtreeStream stream_include_key=new RewriteRuleSubtreeStream(adaptor,"rule include_key");
        RewriteRuleSubtreeStream stream_unpivot_key=new RewriteRuleSubtreeStream(adaptor,"rule unpivot_key");
        RewriteRuleSubtreeStream stream_pivot_for_clause=new RewriteRuleSubtreeStream(adaptor,"rule pivot_for_clause");
        RewriteRuleSubtreeStream stream_unpivot_in_clause=new RewriteRuleSubtreeStream(adaptor,"rule unpivot_in_clause");
        RewriteRuleSubtreeStream stream_column_name=new RewriteRuleSubtreeStream(adaptor,"rule column_name");
        try {
            // PLSQL_DMLParser.g:359:5: ( unpivot_key ( ( include_key | exclude_key ) nulls_key )? LEFT_PAREN ( column_name | LEFT_PAREN column_name ( COMMA column_name )* RIGHT_PAREN ) pivot_for_clause unpivot_in_clause RIGHT_PAREN -> ^( unpivot_key ( include_key )? ( exclude_key )? ( nulls_key )? ( column_name )+ pivot_for_clause unpivot_in_clause ) )
            // PLSQL_DMLParser.g:359:10: unpivot_key ( ( include_key | exclude_key ) nulls_key )? LEFT_PAREN ( column_name | LEFT_PAREN column_name ( COMMA column_name )* RIGHT_PAREN ) pivot_for_clause unpivot_in_clause RIGHT_PAREN
            {
            pushFollow(FOLLOW_unpivot_key_in_unpivot_clause2581);
            unpivot_key143=gPLSQLParser.unpivot_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_unpivot_key.add(unpivot_key143.getTree());

            // PLSQL_DMLParser.g:360:9: ( ( include_key | exclude_key ) nulls_key )?
            int alt52=2;
            int LA52_0 = input.LA(1);

            if ( (LA52_0==REGULAR_ID) && (((input.LT(1).getText().equalsIgnoreCase("exclude"))||(input.LT(1).getText().equalsIgnoreCase("include"))))) {
                alt52=1;
            }
            switch (alt52) {
                case 1 :
                    // PLSQL_DMLParser.g:360:10: ( include_key | exclude_key ) nulls_key
                    {
                    // PLSQL_DMLParser.g:360:10: ( include_key | exclude_key )
                    int alt51=2;
                    int LA51_0 = input.LA(1);

                    if ( (LA51_0==REGULAR_ID) && (((input.LT(1).getText().equalsIgnoreCase("exclude"))||(input.LT(1).getText().equalsIgnoreCase("include"))))) {
                        int LA51_1 = input.LA(2);

                        if ( ((input.LT(1).getText().equalsIgnoreCase("include"))) ) {
                            alt51=1;
                        }
                        else if ( ((input.LT(1).getText().equalsIgnoreCase("exclude"))) ) {
                            alt51=2;
                        }
                        else {
                            if (state.backtracking>0) {state.failed=true; return retval;}
                            NoViableAltException nvae =
                                new NoViableAltException("", 51, 1, input);

                            throw nvae;

                        }
                    }
                    else {
                        if (state.backtracking>0) {state.failed=true; return retval;}
                        NoViableAltException nvae =
                            new NoViableAltException("", 51, 0, input);

                        throw nvae;

                    }
                    switch (alt51) {
                        case 1 :
                            // PLSQL_DMLParser.g:360:11: include_key
                            {
                            pushFollow(FOLLOW_include_key_in_unpivot_clause2594);
                            include_key144=gPLSQLParser.include_key();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) stream_include_key.add(include_key144.getTree());

                            }
                            break;
                        case 2 :
                            // PLSQL_DMLParser.g:360:23: exclude_key
                            {
                            pushFollow(FOLLOW_exclude_key_in_unpivot_clause2596);
                            exclude_key145=gPLSQLParser.exclude_key();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) stream_exclude_key.add(exclude_key145.getTree());

                            }
                            break;

                    }


                    pushFollow(FOLLOW_nulls_key_in_unpivot_clause2599);
                    nulls_key146=gPLSQLParser.nulls_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_nulls_key.add(nulls_key146.getTree());

                    }
                    break;

            }


            LEFT_PAREN147=(Token)match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_unpivot_clause2611); if (state.failed) return retval; 
            if ( state.backtracking==0 ) stream_LEFT_PAREN.add(LEFT_PAREN147);


            // PLSQL_DMLParser.g:362:13: ( column_name | LEFT_PAREN column_name ( COMMA column_name )* RIGHT_PAREN )
            int alt54=2;
            int LA54_0 = input.LA(1);

            if ( (LA54_0==DELIMITED_ID||LA54_0==INTRODUCER||LA54_0==REGULAR_ID) ) {
                alt54=1;
            }
            else if ( (LA54_0==LEFT_PAREN) ) {
                alt54=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return retval;}
                NoViableAltException nvae =
                    new NoViableAltException("", 54, 0, input);

                throw nvae;

            }
            switch (alt54) {
                case 1 :
                    // PLSQL_DMLParser.g:362:18: column_name
                    {
                    pushFollow(FOLLOW_column_name_in_unpivot_clause2630);
                    column_name148=gPLSQLParser.column_name();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_column_name.add(column_name148.getTree());

                    }
                    break;
                case 2 :
                    // PLSQL_DMLParser.g:363:18: LEFT_PAREN column_name ( COMMA column_name )* RIGHT_PAREN
                    {
                    LEFT_PAREN149=(Token)match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_unpivot_clause2649); if (state.failed) return retval; 
                    if ( state.backtracking==0 ) stream_LEFT_PAREN.add(LEFT_PAREN149);


                    pushFollow(FOLLOW_column_name_in_unpivot_clause2651);
                    column_name150=gPLSQLParser.column_name();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_column_name.add(column_name150.getTree());

                    // PLSQL_DMLParser.g:363:41: ( COMMA column_name )*
                    loop53:
                    do {
                        int alt53=2;
                        int LA53_0 = input.LA(1);

                        if ( (LA53_0==COMMA) ) {
                            alt53=1;
                        }


                        switch (alt53) {
                    	case 1 :
                    	    // PLSQL_DMLParser.g:363:42: COMMA column_name
                    	    {
                    	    COMMA151=(Token)match(input,COMMA,FOLLOW_COMMA_in_unpivot_clause2654); if (state.failed) return retval; 
                    	    if ( state.backtracking==0 ) stream_COMMA.add(COMMA151);


                    	    pushFollow(FOLLOW_column_name_in_unpivot_clause2656);
                    	    column_name152=gPLSQLParser.column_name();

                    	    state._fsp--;
                    	    if (state.failed) return retval;
                    	    if ( state.backtracking==0 ) stream_column_name.add(column_name152.getTree());

                    	    }
                    	    break;

                    	default :
                    	    break loop53;
                        }
                    } while (true);


                    RIGHT_PAREN153=(Token)match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_unpivot_clause2660); if (state.failed) return retval; 
                    if ( state.backtracking==0 ) stream_RIGHT_PAREN.add(RIGHT_PAREN153);


                    }
                    break;

            }


            pushFollow(FOLLOW_pivot_for_clause_in_unpivot_clause2688);
            pivot_for_clause154=pivot_for_clause();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_pivot_for_clause.add(pivot_for_clause154.getTree());

            pushFollow(FOLLOW_unpivot_in_clause_in_unpivot_clause2702);
            unpivot_in_clause155=unpivot_in_clause();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_unpivot_in_clause.add(unpivot_in_clause155.getTree());

            RIGHT_PAREN156=(Token)match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_unpivot_clause2712); if (state.failed) return retval; 
            if ( state.backtracking==0 ) stream_RIGHT_PAREN.add(RIGHT_PAREN156);


            // AST REWRITE
            // elements: pivot_for_clause, unpivot_in_clause, column_name, nulls_key, unpivot_key, exclude_key, include_key
            // token labels: 
            // rule labels: retval
            // token list labels: 
            // rule list labels: 
            // wildcard labels: 
            if ( state.backtracking==0 ) {

            retval.tree = root_0;
            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

            root_0 = (Object)adaptor.nil();
            // 368:9: -> ^( unpivot_key ( include_key )? ( exclude_key )? ( nulls_key )? ( column_name )+ pivot_for_clause unpivot_in_clause )
            {
                // PLSQL_DMLParser.g:368:12: ^( unpivot_key ( include_key )? ( exclude_key )? ( nulls_key )? ( column_name )+ pivot_for_clause unpivot_in_clause )
                {
                Object root_1 = (Object)adaptor.nil();
                root_1 = (Object)adaptor.becomeRoot(stream_unpivot_key.nextNode(), root_1);

                // PLSQL_DMLParser.g:368:26: ( include_key )?
                if ( stream_include_key.hasNext() ) {
                    adaptor.addChild(root_1, stream_include_key.nextTree());

                }
                stream_include_key.reset();

                // PLSQL_DMLParser.g:368:39: ( exclude_key )?
                if ( stream_exclude_key.hasNext() ) {
                    adaptor.addChild(root_1, stream_exclude_key.nextTree());

                }
                stream_exclude_key.reset();

                // PLSQL_DMLParser.g:368:52: ( nulls_key )?
                if ( stream_nulls_key.hasNext() ) {
                    adaptor.addChild(root_1, stream_nulls_key.nextTree());

                }
                stream_nulls_key.reset();

                if ( !(stream_column_name.hasNext()) ) {
                    throw new RewriteEarlyExitException();
                }
                while ( stream_column_name.hasNext() ) {
                    adaptor.addChild(root_1, stream_column_name.nextTree());

                }
                stream_column_name.reset();

                adaptor.addChild(root_1, stream_pivot_for_clause.nextTree());

                adaptor.addChild(root_1, stream_unpivot_in_clause.nextTree());

                adaptor.addChild(root_0, root_1);
                }

            }


            retval.tree = root_0;
            }

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "unpivot_clause"


    public static class unpivot_in_clause_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "unpivot_in_clause"
    // PLSQL_DMLParser.g:371:1: unpivot_in_clause : in_key LEFT_PAREN unpivot_in_elements ( COMMA unpivot_in_elements )* RIGHT_PAREN -> ^( in_key ( ^( UNPIVOT_IN_ELEMENT unpivot_in_elements ) )+ ) ;
    public final PLSQLParser_PLSQL_DMLParser.unpivot_in_clause_return unpivot_in_clause() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.unpivot_in_clause_return retval = new PLSQLParser_PLSQL_DMLParser.unpivot_in_clause_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token LEFT_PAREN158=null;
        Token COMMA160=null;
        Token RIGHT_PAREN162=null;
        PLSQLParser_PLSQLKeys.in_key_return in_key157 =null;

        PLSQLParser_PLSQL_DMLParser.unpivot_in_elements_return unpivot_in_elements159 =null;

        PLSQLParser_PLSQL_DMLParser.unpivot_in_elements_return unpivot_in_elements161 =null;


        Object LEFT_PAREN158_tree=null;
        Object COMMA160_tree=null;
        Object RIGHT_PAREN162_tree=null;
        RewriteRuleTokenStream stream_LEFT_PAREN=new RewriteRuleTokenStream(adaptor,"token LEFT_PAREN");
        RewriteRuleTokenStream stream_RIGHT_PAREN=new RewriteRuleTokenStream(adaptor,"token RIGHT_PAREN");
        RewriteRuleTokenStream stream_COMMA=new RewriteRuleTokenStream(adaptor,"token COMMA");
        RewriteRuleSubtreeStream stream_unpivot_in_elements=new RewriteRuleSubtreeStream(adaptor,"rule unpivot_in_elements");
        RewriteRuleSubtreeStream stream_in_key=new RewriteRuleSubtreeStream(adaptor,"rule in_key");
        try {
            // PLSQL_DMLParser.g:372:5: ( in_key LEFT_PAREN unpivot_in_elements ( COMMA unpivot_in_elements )* RIGHT_PAREN -> ^( in_key ( ^( UNPIVOT_IN_ELEMENT unpivot_in_elements ) )+ ) )
            // PLSQL_DMLParser.g:372:10: in_key LEFT_PAREN unpivot_in_elements ( COMMA unpivot_in_elements )* RIGHT_PAREN
            {
            pushFollow(FOLLOW_in_key_in_unpivot_in_clause2762);
            in_key157=gPLSQLParser.in_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_in_key.add(in_key157.getTree());

            LEFT_PAREN158=(Token)match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_unpivot_in_clause2772); if (state.failed) return retval; 
            if ( state.backtracking==0 ) stream_LEFT_PAREN.add(LEFT_PAREN158);


            pushFollow(FOLLOW_unpivot_in_elements_in_unpivot_in_clause2786);
            unpivot_in_elements159=unpivot_in_elements();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_unpivot_in_elements.add(unpivot_in_elements159.getTree());

            // PLSQL_DMLParser.g:374:33: ( COMMA unpivot_in_elements )*
            loop55:
            do {
                int alt55=2;
                int LA55_0 = input.LA(1);

                if ( (LA55_0==COMMA) ) {
                    alt55=1;
                }


                switch (alt55) {
            	case 1 :
            	    // PLSQL_DMLParser.g:374:34: COMMA unpivot_in_elements
            	    {
            	    COMMA160=(Token)match(input,COMMA,FOLLOW_COMMA_in_unpivot_in_clause2789); if (state.failed) return retval; 
            	    if ( state.backtracking==0 ) stream_COMMA.add(COMMA160);


            	    pushFollow(FOLLOW_unpivot_in_elements_in_unpivot_in_clause2791);
            	    unpivot_in_elements161=unpivot_in_elements();

            	    state._fsp--;
            	    if (state.failed) return retval;
            	    if ( state.backtracking==0 ) stream_unpivot_in_elements.add(unpivot_in_elements161.getTree());

            	    }
            	    break;

            	default :
            	    break loop55;
                }
            } while (true);


            RIGHT_PAREN162=(Token)match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_unpivot_in_clause2803); if (state.failed) return retval; 
            if ( state.backtracking==0 ) stream_RIGHT_PAREN.add(RIGHT_PAREN162);


            // AST REWRITE
            // elements: unpivot_in_elements, in_key
            // token labels: 
            // rule labels: retval
            // token list labels: 
            // rule list labels: 
            // wildcard labels: 
            if ( state.backtracking==0 ) {

            retval.tree = root_0;
            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

            root_0 = (Object)adaptor.nil();
            // 376:9: -> ^( in_key ( ^( UNPIVOT_IN_ELEMENT unpivot_in_elements ) )+ )
            {
                // PLSQL_DMLParser.g:376:12: ^( in_key ( ^( UNPIVOT_IN_ELEMENT unpivot_in_elements ) )+ )
                {
                Object root_1 = (Object)adaptor.nil();
                root_1 = (Object)adaptor.becomeRoot(stream_in_key.nextNode(), root_1);

                if ( !(stream_unpivot_in_elements.hasNext()) ) {
                    throw new RewriteEarlyExitException();
                }
                while ( stream_unpivot_in_elements.hasNext() ) {
                    // PLSQL_DMLParser.g:376:21: ^( UNPIVOT_IN_ELEMENT unpivot_in_elements )
                    {
                    Object root_2 = (Object)adaptor.nil();
                    root_2 = (Object)adaptor.becomeRoot(
                    (Object)adaptor.create(UNPIVOT_IN_ELEMENT, "UNPIVOT_IN_ELEMENT")
                    , root_2);

                    adaptor.addChild(root_2, stream_unpivot_in_elements.nextTree());

                    adaptor.addChild(root_1, root_2);
                    }

                }
                stream_unpivot_in_elements.reset();

                adaptor.addChild(root_0, root_1);
                }

            }


            retval.tree = root_0;
            }

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "unpivot_in_clause"


    public static class unpivot_in_elements_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "unpivot_in_elements"
    // PLSQL_DMLParser.g:379:1: unpivot_in_elements : ( column_name | LEFT_PAREN column_name ( COMMA column_name )* RIGHT_PAREN ) ( as_key )? ( expression_wrapper | ( LEFT_PAREN )=> expression_list ) -> ( column_name )+ ^( PIVOT_ALIAS ( expression_wrapper )? ( expression_list )? ) ;
    public final PLSQLParser_PLSQL_DMLParser.unpivot_in_elements_return unpivot_in_elements() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.unpivot_in_elements_return retval = new PLSQLParser_PLSQL_DMLParser.unpivot_in_elements_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token LEFT_PAREN164=null;
        Token COMMA166=null;
        Token RIGHT_PAREN168=null;
        PLSQLParser_PLSQLCommons.column_name_return column_name163 =null;

        PLSQLParser_PLSQLCommons.column_name_return column_name165 =null;

        PLSQLParser_PLSQLCommons.column_name_return column_name167 =null;

        PLSQLParser_PLSQLKeys.as_key_return as_key169 =null;

        PLSQLParser_PLSQL_DMLParser.expression_wrapper_return expression_wrapper170 =null;

        PLSQLParser_PLSQL_DMLParser.expression_list_return expression_list171 =null;


        Object LEFT_PAREN164_tree=null;
        Object COMMA166_tree=null;
        Object RIGHT_PAREN168_tree=null;
        RewriteRuleTokenStream stream_LEFT_PAREN=new RewriteRuleTokenStream(adaptor,"token LEFT_PAREN");
        RewriteRuleTokenStream stream_RIGHT_PAREN=new RewriteRuleTokenStream(adaptor,"token RIGHT_PAREN");
        RewriteRuleTokenStream stream_COMMA=new RewriteRuleTokenStream(adaptor,"token COMMA");
        RewriteRuleSubtreeStream stream_expression_list=new RewriteRuleSubtreeStream(adaptor,"rule expression_list");
        RewriteRuleSubtreeStream stream_expression_wrapper=new RewriteRuleSubtreeStream(adaptor,"rule expression_wrapper");
        RewriteRuleSubtreeStream stream_as_key=new RewriteRuleSubtreeStream(adaptor,"rule as_key");
        RewriteRuleSubtreeStream stream_column_name=new RewriteRuleSubtreeStream(adaptor,"rule column_name");
        try {
            // PLSQL_DMLParser.g:380:5: ( ( column_name | LEFT_PAREN column_name ( COMMA column_name )* RIGHT_PAREN ) ( as_key )? ( expression_wrapper | ( LEFT_PAREN )=> expression_list ) -> ( column_name )+ ^( PIVOT_ALIAS ( expression_wrapper )? ( expression_list )? ) )
            // PLSQL_DMLParser.g:380:10: ( column_name | LEFT_PAREN column_name ( COMMA column_name )* RIGHT_PAREN ) ( as_key )? ( expression_wrapper | ( LEFT_PAREN )=> expression_list )
            {
            // PLSQL_DMLParser.g:380:10: ( column_name | LEFT_PAREN column_name ( COMMA column_name )* RIGHT_PAREN )
            int alt57=2;
            int LA57_0 = input.LA(1);

            if ( (LA57_0==DELIMITED_ID||LA57_0==INTRODUCER||LA57_0==REGULAR_ID) ) {
                alt57=1;
            }
            else if ( (LA57_0==LEFT_PAREN) ) {
                alt57=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return retval;}
                NoViableAltException nvae =
                    new NoViableAltException("", 57, 0, input);

                throw nvae;

            }
            switch (alt57) {
                case 1 :
                    // PLSQL_DMLParser.g:380:15: column_name
                    {
                    pushFollow(FOLLOW_column_name_in_unpivot_in_elements2849);
                    column_name163=gPLSQLParser.column_name();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_column_name.add(column_name163.getTree());

                    }
                    break;
                case 2 :
                    // PLSQL_DMLParser.g:381:14: LEFT_PAREN column_name ( COMMA column_name )* RIGHT_PAREN
                    {
                    LEFT_PAREN164=(Token)match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_unpivot_in_elements2864); if (state.failed) return retval; 
                    if ( state.backtracking==0 ) stream_LEFT_PAREN.add(LEFT_PAREN164);


                    pushFollow(FOLLOW_column_name_in_unpivot_in_elements2866);
                    column_name165=gPLSQLParser.column_name();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_column_name.add(column_name165.getTree());

                    // PLSQL_DMLParser.g:381:37: ( COMMA column_name )*
                    loop56:
                    do {
                        int alt56=2;
                        int LA56_0 = input.LA(1);

                        if ( (LA56_0==COMMA) ) {
                            alt56=1;
                        }


                        switch (alt56) {
                    	case 1 :
                    	    // PLSQL_DMLParser.g:381:38: COMMA column_name
                    	    {
                    	    COMMA166=(Token)match(input,COMMA,FOLLOW_COMMA_in_unpivot_in_elements2869); if (state.failed) return retval; 
                    	    if ( state.backtracking==0 ) stream_COMMA.add(COMMA166);


                    	    pushFollow(FOLLOW_column_name_in_unpivot_in_elements2871);
                    	    column_name167=gPLSQLParser.column_name();

                    	    state._fsp--;
                    	    if (state.failed) return retval;
                    	    if ( state.backtracking==0 ) stream_column_name.add(column_name167.getTree());

                    	    }
                    	    break;

                    	default :
                    	    break loop56;
                        }
                    } while (true);


                    RIGHT_PAREN168=(Token)match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_unpivot_in_elements2875); if (state.failed) return retval; 
                    if ( state.backtracking==0 ) stream_RIGHT_PAREN.add(RIGHT_PAREN168);


                    }
                    break;

            }


            // PLSQL_DMLParser.g:383:9: ( as_key )?
            int alt58=2;
            int LA58_0 = input.LA(1);

            if ( (LA58_0==SQL92_RESERVED_AS) ) {
                alt58=1;
            }
            switch (alt58) {
                case 1 :
                    // PLSQL_DMLParser.g:383:9: as_key
                    {
                    pushFollow(FOLLOW_as_key_in_unpivot_in_elements2895);
                    as_key169=gPLSQLParser.as_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_as_key.add(as_key169.getTree());

                    }
                    break;

            }


            // PLSQL_DMLParser.g:384:9: ( expression_wrapper | ( LEFT_PAREN )=> expression_list )
            int alt59=2;
            int LA59_0 = input.LA(1);

            if ( (LA59_0==APPROXIMATE_NUM_LIT||(LA59_0 >= CHAR_STRING && LA59_0 <= COLON)||LA59_0==DELIMITED_ID||LA59_0==EXACT_NUM_LIT||LA59_0==INTRODUCER||LA59_0==MINUS_SIGN||LA59_0==PLUS_SIGN||LA59_0==REGULAR_ID||LA59_0==SQL92_RESERVED_ALL||LA59_0==SQL92_RESERVED_ANY||LA59_0==SQL92_RESERVED_CASE||LA59_0==SQL92_RESERVED_DEFAULT||LA59_0==SQL92_RESERVED_DISTINCT||(LA59_0 >= SQL92_RESERVED_EXISTS && LA59_0 <= SQL92_RESERVED_FALSE)||(LA59_0 >= SQL92_RESERVED_NOT && LA59_0 <= SQL92_RESERVED_NULL)||LA59_0==SQL92_RESERVED_PRIOR||LA59_0==SQL92_RESERVED_TRUE||LA59_0==UNSIGNED_INTEGER) ) {
                alt59=1;
            }
            else if ( (LA59_0==LEFT_PAREN) ) {
                int LA59_20 = input.LA(2);

                if ( (true) ) {
                    alt59=1;
                }
                else if ( (synpred8_PLSQL_DMLParser()) ) {
                    alt59=2;
                }
                else {
                    if (state.backtracking>0) {state.failed=true; return retval;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 59, 20, input);

                    throw nvae;

                }
            }
            else {
                if (state.backtracking>0) {state.failed=true; return retval;}
                NoViableAltException nvae =
                    new NoViableAltException("", 59, 0, input);

                throw nvae;

            }
            switch (alt59) {
                case 1 :
                    // PLSQL_DMLParser.g:384:14: expression_wrapper
                    {
                    pushFollow(FOLLOW_expression_wrapper_in_unpivot_in_elements2911);
                    expression_wrapper170=expression_wrapper();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_expression_wrapper.add(expression_wrapper170.getTree());

                    }
                    break;
                case 2 :
                    // PLSQL_DMLParser.g:385:14: ( LEFT_PAREN )=> expression_list
                    {
                    pushFollow(FOLLOW_expression_list_in_unpivot_in_elements2931);
                    expression_list171=expression_list();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_expression_list.add(expression_list171.getTree());

                    }
                    break;

            }


            // AST REWRITE
            // elements: column_name, expression_list, expression_wrapper
            // token labels: 
            // rule labels: retval
            // token list labels: 
            // rule list labels: 
            // wildcard labels: 
            if ( state.backtracking==0 ) {

            retval.tree = root_0;
            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

            root_0 = (Object)adaptor.nil();
            // 387:9: -> ( column_name )+ ^( PIVOT_ALIAS ( expression_wrapper )? ( expression_list )? )
            {
                if ( !(stream_column_name.hasNext()) ) {
                    throw new RewriteEarlyExitException();
                }
                while ( stream_column_name.hasNext() ) {
                    adaptor.addChild(root_0, stream_column_name.nextTree());

                }
                stream_column_name.reset();

                // PLSQL_DMLParser.g:387:25: ^( PIVOT_ALIAS ( expression_wrapper )? ( expression_list )? )
                {
                Object root_1 = (Object)adaptor.nil();
                root_1 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(PIVOT_ALIAS, "PIVOT_ALIAS")
                , root_1);

                // PLSQL_DMLParser.g:387:39: ( expression_wrapper )?
                if ( stream_expression_wrapper.hasNext() ) {
                    adaptor.addChild(root_1, stream_expression_wrapper.nextTree());

                }
                stream_expression_wrapper.reset();

                // PLSQL_DMLParser.g:387:59: ( expression_list )?
                if ( stream_expression_list.hasNext() ) {
                    adaptor.addChild(root_1, stream_expression_list.nextTree());

                }
                stream_expression_list.reset();

                adaptor.addChild(root_0, root_1);
                }

            }


            retval.tree = root_0;
            }

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "unpivot_in_elements"


    public static class hierarchical_query_clause_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "hierarchical_query_clause"
    // PLSQL_DMLParser.g:390:1: hierarchical_query_clause : ( connect_key by_key ( nocycle_key )? condition ( start_part )? -> ^( HIERARCHICAL ( start_part )? ^( connect_key ( nocycle_key )? ^( LOGIC_EXPR condition ) ) ) | start_part connect_key by_key ( nocycle_key )? condition -> ^( HIERARCHICAL start_part ^( connect_key ( nocycle_key )? ^( LOGIC_EXPR condition ) ) ) );
    public final PLSQLParser_PLSQL_DMLParser.hierarchical_query_clause_return hierarchical_query_clause() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.hierarchical_query_clause_return retval = new PLSQLParser_PLSQL_DMLParser.hierarchical_query_clause_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        PLSQLParser_PLSQLKeys.connect_key_return connect_key172 =null;

        PLSQLParser_PLSQLKeys.by_key_return by_key173 =null;

        PLSQLParser_PLSQLKeys.nocycle_key_return nocycle_key174 =null;

        PLSQLParser_PLSQL_DMLParser.condition_return condition175 =null;

        PLSQLParser_PLSQL_DMLParser.start_part_return start_part176 =null;

        PLSQLParser_PLSQL_DMLParser.start_part_return start_part177 =null;

        PLSQLParser_PLSQLKeys.connect_key_return connect_key178 =null;

        PLSQLParser_PLSQLKeys.by_key_return by_key179 =null;

        PLSQLParser_PLSQLKeys.nocycle_key_return nocycle_key180 =null;

        PLSQLParser_PLSQL_DMLParser.condition_return condition181 =null;


        RewriteRuleSubtreeStream stream_connect_key=new RewriteRuleSubtreeStream(adaptor,"rule connect_key");
        RewriteRuleSubtreeStream stream_condition=new RewriteRuleSubtreeStream(adaptor,"rule condition");
        RewriteRuleSubtreeStream stream_start_part=new RewriteRuleSubtreeStream(adaptor,"rule start_part");
        RewriteRuleSubtreeStream stream_by_key=new RewriteRuleSubtreeStream(adaptor,"rule by_key");
        RewriteRuleSubtreeStream stream_nocycle_key=new RewriteRuleSubtreeStream(adaptor,"rule nocycle_key");
        try {
            // PLSQL_DMLParser.g:391:5: ( connect_key by_key ( nocycle_key )? condition ( start_part )? -> ^( HIERARCHICAL ( start_part )? ^( connect_key ( nocycle_key )? ^( LOGIC_EXPR condition ) ) ) | start_part connect_key by_key ( nocycle_key )? condition -> ^( HIERARCHICAL start_part ^( connect_key ( nocycle_key )? ^( LOGIC_EXPR condition ) ) ) )
            int alt63=2;
            int LA63_0 = input.LA(1);

            if ( (LA63_0==SQL92_RESERVED_CONNECT) ) {
                alt63=1;
            }
            else if ( (LA63_0==PLSQL_RESERVED_START) ) {
                alt63=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return retval;}
                NoViableAltException nvae =
                    new NoViableAltException("", 63, 0, input);

                throw nvae;

            }
            switch (alt63) {
                case 1 :
                    // PLSQL_DMLParser.g:391:10: connect_key by_key ( nocycle_key )? condition ( start_part )?
                    {
                    pushFollow(FOLLOW_connect_key_in_hierarchical_query_clause2984);
                    connect_key172=gPLSQLParser.connect_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_connect_key.add(connect_key172.getTree());

                    pushFollow(FOLLOW_by_key_in_hierarchical_query_clause2986);
                    by_key173=gPLSQLParser.by_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_by_key.add(by_key173.getTree());

                    // PLSQL_DMLParser.g:391:29: ( nocycle_key )?
                    int alt60=2;
                    int LA60_0 = input.LA(1);

                    if ( (LA60_0==REGULAR_ID) ) {
                        int LA60_1 = input.LA(2);

                        if ( ((input.LT(1).getText().equalsIgnoreCase("nocycle"))) ) {
                            alt60=1;
                        }
                    }
                    switch (alt60) {
                        case 1 :
                            // PLSQL_DMLParser.g:391:29: nocycle_key
                            {
                            pushFollow(FOLLOW_nocycle_key_in_hierarchical_query_clause2988);
                            nocycle_key174=gPLSQLParser.nocycle_key();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) stream_nocycle_key.add(nocycle_key174.getTree());

                            }
                            break;

                    }


                    pushFollow(FOLLOW_condition_in_hierarchical_query_clause2991);
                    condition175=condition();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_condition.add(condition175.getTree());

                    // PLSQL_DMLParser.g:391:52: ( start_part )?
                    int alt61=2;
                    int LA61_0 = input.LA(1);

                    if ( (LA61_0==PLSQL_RESERVED_START) ) {
                        alt61=1;
                    }
                    switch (alt61) {
                        case 1 :
                            // PLSQL_DMLParser.g:391:52: start_part
                            {
                            pushFollow(FOLLOW_start_part_in_hierarchical_query_clause2993);
                            start_part176=start_part();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) stream_start_part.add(start_part176.getTree());

                            }
                            break;

                    }


                    // AST REWRITE
                    // elements: nocycle_key, condition, start_part, connect_key
                    // token labels: 
                    // rule labels: retval
                    // token list labels: 
                    // rule list labels: 
                    // wildcard labels: 
                    if ( state.backtracking==0 ) {

                    retval.tree = root_0;
                    RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

                    root_0 = (Object)adaptor.nil();
                    // 392:9: -> ^( HIERARCHICAL ( start_part )? ^( connect_key ( nocycle_key )? ^( LOGIC_EXPR condition ) ) )
                    {
                        // PLSQL_DMLParser.g:392:12: ^( HIERARCHICAL ( start_part )? ^( connect_key ( nocycle_key )? ^( LOGIC_EXPR condition ) ) )
                        {
                        Object root_1 = (Object)adaptor.nil();
                        root_1 = (Object)adaptor.becomeRoot(
                        (Object)adaptor.create(HIERARCHICAL, "HIERARCHICAL")
                        , root_1);

                        // PLSQL_DMLParser.g:392:27: ( start_part )?
                        if ( stream_start_part.hasNext() ) {
                            adaptor.addChild(root_1, stream_start_part.nextTree());

                        }
                        stream_start_part.reset();

                        // PLSQL_DMLParser.g:392:39: ^( connect_key ( nocycle_key )? ^( LOGIC_EXPR condition ) )
                        {
                        Object root_2 = (Object)adaptor.nil();
                        root_2 = (Object)adaptor.becomeRoot(stream_connect_key.nextNode(), root_2);

                        // PLSQL_DMLParser.g:392:53: ( nocycle_key )?
                        if ( stream_nocycle_key.hasNext() ) {
                            adaptor.addChild(root_2, stream_nocycle_key.nextTree());

                        }
                        stream_nocycle_key.reset();

                        // PLSQL_DMLParser.g:392:66: ^( LOGIC_EXPR condition )
                        {
                        Object root_3 = (Object)adaptor.nil();
                        root_3 = (Object)adaptor.becomeRoot(
                        (Object)adaptor.create(LOGIC_EXPR, "LOGIC_EXPR")
                        , root_3);

                        adaptor.addChild(root_3, stream_condition.nextTree());

                        adaptor.addChild(root_2, root_3);
                        }

                        adaptor.addChild(root_1, root_2);
                        }

                        adaptor.addChild(root_0, root_1);
                        }

                    }


                    retval.tree = root_0;
                    }

                    }
                    break;
                case 2 :
                    // PLSQL_DMLParser.g:393:10: start_part connect_key by_key ( nocycle_key )? condition
                    {
                    pushFollow(FOLLOW_start_part_in_hierarchical_query_clause3035);
                    start_part177=start_part();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_start_part.add(start_part177.getTree());

                    pushFollow(FOLLOW_connect_key_in_hierarchical_query_clause3037);
                    connect_key178=gPLSQLParser.connect_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_connect_key.add(connect_key178.getTree());

                    pushFollow(FOLLOW_by_key_in_hierarchical_query_clause3039);
                    by_key179=gPLSQLParser.by_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_by_key.add(by_key179.getTree());

                    // PLSQL_DMLParser.g:393:40: ( nocycle_key )?
                    int alt62=2;
                    int LA62_0 = input.LA(1);

                    if ( (LA62_0==REGULAR_ID) ) {
                        int LA62_1 = input.LA(2);

                        if ( ((input.LT(1).getText().equalsIgnoreCase("nocycle"))) ) {
                            alt62=1;
                        }
                    }
                    switch (alt62) {
                        case 1 :
                            // PLSQL_DMLParser.g:393:40: nocycle_key
                            {
                            pushFollow(FOLLOW_nocycle_key_in_hierarchical_query_clause3041);
                            nocycle_key180=gPLSQLParser.nocycle_key();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) stream_nocycle_key.add(nocycle_key180.getTree());

                            }
                            break;

                    }


                    pushFollow(FOLLOW_condition_in_hierarchical_query_clause3044);
                    condition181=condition();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_condition.add(condition181.getTree());

                    // AST REWRITE
                    // elements: nocycle_key, condition, start_part, connect_key
                    // token labels: 
                    // rule labels: retval
                    // token list labels: 
                    // rule list labels: 
                    // wildcard labels: 
                    if ( state.backtracking==0 ) {

                    retval.tree = root_0;
                    RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

                    root_0 = (Object)adaptor.nil();
                    // 394:9: -> ^( HIERARCHICAL start_part ^( connect_key ( nocycle_key )? ^( LOGIC_EXPR condition ) ) )
                    {
                        // PLSQL_DMLParser.g:394:12: ^( HIERARCHICAL start_part ^( connect_key ( nocycle_key )? ^( LOGIC_EXPR condition ) ) )
                        {
                        Object root_1 = (Object)adaptor.nil();
                        root_1 = (Object)adaptor.becomeRoot(
                        (Object)adaptor.create(HIERARCHICAL, "HIERARCHICAL")
                        , root_1);

                        adaptor.addChild(root_1, stream_start_part.nextTree());

                        // PLSQL_DMLParser.g:394:38: ^( connect_key ( nocycle_key )? ^( LOGIC_EXPR condition ) )
                        {
                        Object root_2 = (Object)adaptor.nil();
                        root_2 = (Object)adaptor.becomeRoot(stream_connect_key.nextNode(), root_2);

                        // PLSQL_DMLParser.g:394:52: ( nocycle_key )?
                        if ( stream_nocycle_key.hasNext() ) {
                            adaptor.addChild(root_2, stream_nocycle_key.nextTree());

                        }
                        stream_nocycle_key.reset();

                        // PLSQL_DMLParser.g:394:65: ^( LOGIC_EXPR condition )
                        {
                        Object root_3 = (Object)adaptor.nil();
                        root_3 = (Object)adaptor.becomeRoot(
                        (Object)adaptor.create(LOGIC_EXPR, "LOGIC_EXPR")
                        , root_3);

                        adaptor.addChild(root_3, stream_condition.nextTree());

                        adaptor.addChild(root_2, root_3);
                        }

                        adaptor.addChild(root_1, root_2);
                        }

                        adaptor.addChild(root_0, root_1);
                        }

                    }


                    retval.tree = root_0;
                    }

                    }
                    break;

            }
            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "hierarchical_query_clause"


    public static class start_part_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "start_part"
    // PLSQL_DMLParser.g:397:1: start_part : start_key with_key condition -> ^( start_key ^( LOGIC_EXPR condition ) ) ;
    public final PLSQLParser_PLSQL_DMLParser.start_part_return start_part() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.start_part_return retval = new PLSQLParser_PLSQL_DMLParser.start_part_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        PLSQLParser_PLSQLKeys.start_key_return start_key182 =null;

        PLSQLParser_PLSQLKeys.with_key_return with_key183 =null;

        PLSQLParser_PLSQL_DMLParser.condition_return condition184 =null;


        RewriteRuleSubtreeStream stream_start_key=new RewriteRuleSubtreeStream(adaptor,"rule start_key");
        RewriteRuleSubtreeStream stream_with_key=new RewriteRuleSubtreeStream(adaptor,"rule with_key");
        RewriteRuleSubtreeStream stream_condition=new RewriteRuleSubtreeStream(adaptor,"rule condition");
        try {
            // PLSQL_DMLParser.g:398:5: ( start_key with_key condition -> ^( start_key ^( LOGIC_EXPR condition ) ) )
            // PLSQL_DMLParser.g:398:10: start_key with_key condition
            {
            pushFollow(FOLLOW_start_key_in_start_part3093);
            start_key182=gPLSQLParser.start_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_start_key.add(start_key182.getTree());

            pushFollow(FOLLOW_with_key_in_start_part3095);
            with_key183=gPLSQLParser.with_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_with_key.add(with_key183.getTree());

            pushFollow(FOLLOW_condition_in_start_part3097);
            condition184=condition();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_condition.add(condition184.getTree());

            // AST REWRITE
            // elements: start_key, condition
            // token labels: 
            // rule labels: retval
            // token list labels: 
            // rule list labels: 
            // wildcard labels: 
            if ( state.backtracking==0 ) {

            retval.tree = root_0;
            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

            root_0 = (Object)adaptor.nil();
            // 399:9: -> ^( start_key ^( LOGIC_EXPR condition ) )
            {
                // PLSQL_DMLParser.g:399:12: ^( start_key ^( LOGIC_EXPR condition ) )
                {
                Object root_1 = (Object)adaptor.nil();
                root_1 = (Object)adaptor.becomeRoot(stream_start_key.nextNode(), root_1);

                // PLSQL_DMLParser.g:399:24: ^( LOGIC_EXPR condition )
                {
                Object root_2 = (Object)adaptor.nil();
                root_2 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(LOGIC_EXPR, "LOGIC_EXPR")
                , root_2);

                adaptor.addChild(root_2, stream_condition.nextTree());

                adaptor.addChild(root_1, root_2);
                }

                adaptor.addChild(root_0, root_1);
                }

            }


            retval.tree = root_0;
            }

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "start_part"


    public static class group_by_clause_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "group_by_clause"
    // PLSQL_DMLParser.g:402:1: group_by_clause : group_key by_key group_by_elements ( ( COMMA group_by_elements )=> COMMA group_by_elements )* -> ^( group_key ( ^( GROUP_BY_ELEMENT group_by_elements ) )+ ) ;
    public final PLSQLParser_PLSQL_DMLParser.group_by_clause_return group_by_clause() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.group_by_clause_return retval = new PLSQLParser_PLSQL_DMLParser.group_by_clause_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token COMMA188=null;
        PLSQLParser_PLSQLKeys.group_key_return group_key185 =null;

        PLSQLParser_PLSQLKeys.by_key_return by_key186 =null;

        PLSQLParser_PLSQL_DMLParser.group_by_elements_return group_by_elements187 =null;

        PLSQLParser_PLSQL_DMLParser.group_by_elements_return group_by_elements189 =null;


        Object COMMA188_tree=null;
        RewriteRuleTokenStream stream_COMMA=new RewriteRuleTokenStream(adaptor,"token COMMA");
        RewriteRuleSubtreeStream stream_group_key=new RewriteRuleSubtreeStream(adaptor,"rule group_key");
        RewriteRuleSubtreeStream stream_by_key=new RewriteRuleSubtreeStream(adaptor,"rule by_key");
        RewriteRuleSubtreeStream stream_group_by_elements=new RewriteRuleSubtreeStream(adaptor,"rule group_by_elements");
        try {
            // PLSQL_DMLParser.g:403:5: ( group_key by_key group_by_elements ( ( COMMA group_by_elements )=> COMMA group_by_elements )* -> ^( group_key ( ^( GROUP_BY_ELEMENT group_by_elements ) )+ ) )
            // PLSQL_DMLParser.g:403:10: group_key by_key group_by_elements ( ( COMMA group_by_elements )=> COMMA group_by_elements )*
            {
            pushFollow(FOLLOW_group_key_in_group_by_clause3137);
            group_key185=gPLSQLParser.group_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_group_key.add(group_key185.getTree());

            pushFollow(FOLLOW_by_key_in_group_by_clause3139);
            by_key186=gPLSQLParser.by_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_by_key.add(by_key186.getTree());

            pushFollow(FOLLOW_group_by_elements_in_group_by_clause3141);
            group_by_elements187=group_by_elements();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_group_by_elements.add(group_by_elements187.getTree());

            // PLSQL_DMLParser.g:403:45: ( ( COMMA group_by_elements )=> COMMA group_by_elements )*
            loop64:
            do {
                int alt64=2;
                int LA64_0 = input.LA(1);

                if ( (LA64_0==COMMA) ) {
                    int LA64_23 = input.LA(2);

                    if ( (synpred9_PLSQL_DMLParser()) ) {
                        alt64=1;
                    }


                }


                switch (alt64) {
            	case 1 :
            	    // PLSQL_DMLParser.g:403:46: ( COMMA group_by_elements )=> COMMA group_by_elements
            	    {
            	    COMMA188=(Token)match(input,COMMA,FOLLOW_COMMA_in_group_by_clause3151); if (state.failed) return retval; 
            	    if ( state.backtracking==0 ) stream_COMMA.add(COMMA188);


            	    pushFollow(FOLLOW_group_by_elements_in_group_by_clause3153);
            	    group_by_elements189=group_by_elements();

            	    state._fsp--;
            	    if (state.failed) return retval;
            	    if ( state.backtracking==0 ) stream_group_by_elements.add(group_by_elements189.getTree());

            	    }
            	    break;

            	default :
            	    break loop64;
                }
            } while (true);


            // AST REWRITE
            // elements: group_key, group_by_elements
            // token labels: 
            // rule labels: retval
            // token list labels: 
            // rule list labels: 
            // wildcard labels: 
            if ( state.backtracking==0 ) {

            retval.tree = root_0;
            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

            root_0 = (Object)adaptor.nil();
            // 404:9: -> ^( group_key ( ^( GROUP_BY_ELEMENT group_by_elements ) )+ )
            {
                // PLSQL_DMLParser.g:404:12: ^( group_key ( ^( GROUP_BY_ELEMENT group_by_elements ) )+ )
                {
                Object root_1 = (Object)adaptor.nil();
                root_1 = (Object)adaptor.becomeRoot(stream_group_key.nextNode(), root_1);

                if ( !(stream_group_by_elements.hasNext()) ) {
                    throw new RewriteEarlyExitException();
                }
                while ( stream_group_by_elements.hasNext() ) {
                    // PLSQL_DMLParser.g:404:24: ^( GROUP_BY_ELEMENT group_by_elements )
                    {
                    Object root_2 = (Object)adaptor.nil();
                    root_2 = (Object)adaptor.becomeRoot(
                    (Object)adaptor.create(GROUP_BY_ELEMENT, "GROUP_BY_ELEMENT")
                    , root_2);

                    adaptor.addChild(root_2, stream_group_by_elements.nextTree());

                    adaptor.addChild(root_1, root_2);
                    }

                }
                stream_group_by_elements.reset();

                adaptor.addChild(root_0, root_1);
                }

            }


            retval.tree = root_0;
            }

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "group_by_clause"


    public static class group_by_elements_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "group_by_elements"
    // PLSQL_DMLParser.g:407:1: group_by_elements : ( grouping_sets_clause | rollup_cube_clause | expression -> ^( EXPR expression ) );
    public final PLSQLParser_PLSQL_DMLParser.group_by_elements_return group_by_elements() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.group_by_elements_return retval = new PLSQLParser_PLSQL_DMLParser.group_by_elements_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        PLSQLParser_PLSQL_DMLParser.grouping_sets_clause_return grouping_sets_clause190 =null;

        PLSQLParser_PLSQL_DMLParser.rollup_cube_clause_return rollup_cube_clause191 =null;

        PLSQLParser_PLSQL_DMLParser.expression_return expression192 =null;


        RewriteRuleSubtreeStream stream_expression=new RewriteRuleSubtreeStream(adaptor,"rule expression");
        try {
            // PLSQL_DMLParser.g:408:5: ( grouping_sets_clause | rollup_cube_clause | expression -> ^( EXPR expression ) )
            int alt65=3;
            int LA65_0 = input.LA(1);

            if ( (LA65_0==REGULAR_ID) ) {
                int LA65_1 = input.LA(2);

                if ( ((input.LT(1).getText().equalsIgnoreCase("grouping"))) ) {
                    alt65=1;
                }
                else if ( (((input.LT(1).getText().equalsIgnoreCase("cube"))||(input.LT(1).getText().equalsIgnoreCase("rollup")))) ) {
                    alt65=2;
                }
                else if ( (true) ) {
                    alt65=3;
                }
                else {
                    if (state.backtracking>0) {state.failed=true; return retval;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 65, 1, input);

                    throw nvae;

                }
            }
            else if ( (LA65_0==APPROXIMATE_NUM_LIT||(LA65_0 >= CHAR_STRING && LA65_0 <= COLON)||LA65_0==DELIMITED_ID||LA65_0==EXACT_NUM_LIT||LA65_0==INTRODUCER||LA65_0==LEFT_PAREN||LA65_0==MINUS_SIGN||LA65_0==PLUS_SIGN||LA65_0==SQL92_RESERVED_ALL||LA65_0==SQL92_RESERVED_ANY||LA65_0==SQL92_RESERVED_CASE||LA65_0==SQL92_RESERVED_DEFAULT||LA65_0==SQL92_RESERVED_DISTINCT||(LA65_0 >= SQL92_RESERVED_EXISTS && LA65_0 <= SQL92_RESERVED_FALSE)||(LA65_0 >= SQL92_RESERVED_NOT && LA65_0 <= SQL92_RESERVED_NULL)||LA65_0==SQL92_RESERVED_PRIOR||LA65_0==SQL92_RESERVED_TRUE||LA65_0==UNSIGNED_INTEGER) ) {
                alt65=3;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return retval;}
                NoViableAltException nvae =
                    new NoViableAltException("", 65, 0, input);

                throw nvae;

            }
            switch (alt65) {
                case 1 :
                    // PLSQL_DMLParser.g:408:10: grouping_sets_clause
                    {
                    root_0 = (Object)adaptor.nil();


                    pushFollow(FOLLOW_grouping_sets_clause_in_group_by_elements3196);
                    grouping_sets_clause190=grouping_sets_clause();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, grouping_sets_clause190.getTree());

                    }
                    break;
                case 2 :
                    // PLSQL_DMLParser.g:409:10: rollup_cube_clause
                    {
                    root_0 = (Object)adaptor.nil();


                    pushFollow(FOLLOW_rollup_cube_clause_in_group_by_elements3207);
                    rollup_cube_clause191=rollup_cube_clause();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, rollup_cube_clause191.getTree());

                    }
                    break;
                case 3 :
                    // PLSQL_DMLParser.g:410:10: expression
                    {
                    pushFollow(FOLLOW_expression_in_group_by_elements3219);
                    expression192=expression();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_expression.add(expression192.getTree());

                    // AST REWRITE
                    // elements: expression
                    // token labels: 
                    // rule labels: retval
                    // token list labels: 
                    // rule list labels: 
                    // wildcard labels: 
                    if ( state.backtracking==0 ) {

                    retval.tree = root_0;
                    RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

                    root_0 = (Object)adaptor.nil();
                    // 410:21: -> ^( EXPR expression )
                    {
                        // PLSQL_DMLParser.g:410:24: ^( EXPR expression )
                        {
                        Object root_1 = (Object)adaptor.nil();
                        root_1 = (Object)adaptor.becomeRoot(
                        (Object)adaptor.create(EXPR, "EXPR")
                        , root_1);

                        adaptor.addChild(root_1, stream_expression.nextTree());

                        adaptor.addChild(root_0, root_1);
                        }

                    }


                    retval.tree = root_0;
                    }

                    }
                    break;

            }
            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "group_by_elements"


    public static class rollup_cube_clause_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "rollup_cube_clause"
    // PLSQL_DMLParser.g:413:1: rollup_cube_clause : ( rollup_key ^| cube_key ^) LEFT_PAREN ! grouping_sets_elements ( COMMA ! grouping_sets_elements )* RIGHT_PAREN !;
    public final PLSQLParser_PLSQL_DMLParser.rollup_cube_clause_return rollup_cube_clause() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.rollup_cube_clause_return retval = new PLSQLParser_PLSQL_DMLParser.rollup_cube_clause_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token LEFT_PAREN195=null;
        Token COMMA197=null;
        Token RIGHT_PAREN199=null;
        PLSQLParser_PLSQLKeys.rollup_key_return rollup_key193 =null;

        PLSQLParser_PLSQLKeys.cube_key_return cube_key194 =null;

        PLSQLParser_PLSQL_DMLParser.grouping_sets_elements_return grouping_sets_elements196 =null;

        PLSQLParser_PLSQL_DMLParser.grouping_sets_elements_return grouping_sets_elements198 =null;


        Object LEFT_PAREN195_tree=null;
        Object COMMA197_tree=null;
        Object RIGHT_PAREN199_tree=null;

        try {
            // PLSQL_DMLParser.g:414:5: ( ( rollup_key ^| cube_key ^) LEFT_PAREN ! grouping_sets_elements ( COMMA ! grouping_sets_elements )* RIGHT_PAREN !)
            // PLSQL_DMLParser.g:414:10: ( rollup_key ^| cube_key ^) LEFT_PAREN ! grouping_sets_elements ( COMMA ! grouping_sets_elements )* RIGHT_PAREN !
            {
            root_0 = (Object)adaptor.nil();


            // PLSQL_DMLParser.g:414:10: ( rollup_key ^| cube_key ^)
            int alt66=2;
            int LA66_0 = input.LA(1);

            if ( (LA66_0==REGULAR_ID) && (((input.LT(1).getText().equalsIgnoreCase("cube"))||(input.LT(1).getText().equalsIgnoreCase("rollup"))))) {
                int LA66_1 = input.LA(2);

                if ( ((input.LT(1).getText().equalsIgnoreCase("rollup"))) ) {
                    alt66=1;
                }
                else if ( ((input.LT(1).getText().equalsIgnoreCase("cube"))) ) {
                    alt66=2;
                }
                else {
                    if (state.backtracking>0) {state.failed=true; return retval;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 66, 1, input);

                    throw nvae;

                }
            }
            else {
                if (state.backtracking>0) {state.failed=true; return retval;}
                NoViableAltException nvae =
                    new NoViableAltException("", 66, 0, input);

                throw nvae;

            }
            switch (alt66) {
                case 1 :
                    // PLSQL_DMLParser.g:414:11: rollup_key ^
                    {
                    pushFollow(FOLLOW_rollup_key_in_rollup_cube_clause3248);
                    rollup_key193=gPLSQLParser.rollup_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) root_0 = (Object)adaptor.becomeRoot(rollup_key193.getTree(), root_0);

                    }
                    break;
                case 2 :
                    // PLSQL_DMLParser.g:414:23: cube_key ^
                    {
                    pushFollow(FOLLOW_cube_key_in_rollup_cube_clause3251);
                    cube_key194=gPLSQLParser.cube_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) root_0 = (Object)adaptor.becomeRoot(cube_key194.getTree(), root_0);

                    }
                    break;

            }


            LEFT_PAREN195=(Token)match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_rollup_cube_clause3255); if (state.failed) return retval;

            pushFollow(FOLLOW_grouping_sets_elements_in_rollup_cube_clause3258);
            grouping_sets_elements196=grouping_sets_elements();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) adaptor.addChild(root_0, grouping_sets_elements196.getTree());

            // PLSQL_DMLParser.g:414:69: ( COMMA ! grouping_sets_elements )*
            loop67:
            do {
                int alt67=2;
                int LA67_0 = input.LA(1);

                if ( (LA67_0==COMMA) ) {
                    alt67=1;
                }


                switch (alt67) {
            	case 1 :
            	    // PLSQL_DMLParser.g:414:70: COMMA ! grouping_sets_elements
            	    {
            	    COMMA197=(Token)match(input,COMMA,FOLLOW_COMMA_in_rollup_cube_clause3261); if (state.failed) return retval;

            	    pushFollow(FOLLOW_grouping_sets_elements_in_rollup_cube_clause3264);
            	    grouping_sets_elements198=grouping_sets_elements();

            	    state._fsp--;
            	    if (state.failed) return retval;
            	    if ( state.backtracking==0 ) adaptor.addChild(root_0, grouping_sets_elements198.getTree());

            	    }
            	    break;

            	default :
            	    break loop67;
                }
            } while (true);


            RIGHT_PAREN199=(Token)match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_rollup_cube_clause3268); if (state.failed) return retval;

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "rollup_cube_clause"


    public static class grouping_sets_clause_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "grouping_sets_clause"
    // PLSQL_DMLParser.g:417:1: grouping_sets_clause : grouping_key sets_key LEFT_PAREN grouping_sets_elements ( COMMA grouping_sets_elements )* RIGHT_PAREN -> ^( grouping_key ( ^( GROUPIN_SET grouping_sets_elements ) )+ ) ;
    public final PLSQLParser_PLSQL_DMLParser.grouping_sets_clause_return grouping_sets_clause() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.grouping_sets_clause_return retval = new PLSQLParser_PLSQL_DMLParser.grouping_sets_clause_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token LEFT_PAREN202=null;
        Token COMMA204=null;
        Token RIGHT_PAREN206=null;
        PLSQLParser_PLSQLKeys.grouping_key_return grouping_key200 =null;

        PLSQLParser_PLSQLKeys.sets_key_return sets_key201 =null;

        PLSQLParser_PLSQL_DMLParser.grouping_sets_elements_return grouping_sets_elements203 =null;

        PLSQLParser_PLSQL_DMLParser.grouping_sets_elements_return grouping_sets_elements205 =null;


        Object LEFT_PAREN202_tree=null;
        Object COMMA204_tree=null;
        Object RIGHT_PAREN206_tree=null;
        RewriteRuleTokenStream stream_LEFT_PAREN=new RewriteRuleTokenStream(adaptor,"token LEFT_PAREN");
        RewriteRuleTokenStream stream_RIGHT_PAREN=new RewriteRuleTokenStream(adaptor,"token RIGHT_PAREN");
        RewriteRuleTokenStream stream_COMMA=new RewriteRuleTokenStream(adaptor,"token COMMA");
        RewriteRuleSubtreeStream stream_grouping_key=new RewriteRuleSubtreeStream(adaptor,"rule grouping_key");
        RewriteRuleSubtreeStream stream_sets_key=new RewriteRuleSubtreeStream(adaptor,"rule sets_key");
        RewriteRuleSubtreeStream stream_grouping_sets_elements=new RewriteRuleSubtreeStream(adaptor,"rule grouping_sets_elements");
        try {
            // PLSQL_DMLParser.g:418:5: ( grouping_key sets_key LEFT_PAREN grouping_sets_elements ( COMMA grouping_sets_elements )* RIGHT_PAREN -> ^( grouping_key ( ^( GROUPIN_SET grouping_sets_elements ) )+ ) )
            // PLSQL_DMLParser.g:418:10: grouping_key sets_key LEFT_PAREN grouping_sets_elements ( COMMA grouping_sets_elements )* RIGHT_PAREN
            {
            pushFollow(FOLLOW_grouping_key_in_grouping_sets_clause3290);
            grouping_key200=gPLSQLParser.grouping_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_grouping_key.add(grouping_key200.getTree());

            pushFollow(FOLLOW_sets_key_in_grouping_sets_clause3292);
            sets_key201=gPLSQLParser.sets_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_sets_key.add(sets_key201.getTree());

            LEFT_PAREN202=(Token)match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_grouping_sets_clause3303); if (state.failed) return retval; 
            if ( state.backtracking==0 ) stream_LEFT_PAREN.add(LEFT_PAREN202);


            pushFollow(FOLLOW_grouping_sets_elements_in_grouping_sets_clause3305);
            grouping_sets_elements203=grouping_sets_elements();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_grouping_sets_elements.add(grouping_sets_elements203.getTree());

            // PLSQL_DMLParser.g:419:43: ( COMMA grouping_sets_elements )*
            loop68:
            do {
                int alt68=2;
                int LA68_0 = input.LA(1);

                if ( (LA68_0==COMMA) ) {
                    alt68=1;
                }


                switch (alt68) {
            	case 1 :
            	    // PLSQL_DMLParser.g:419:44: COMMA grouping_sets_elements
            	    {
            	    COMMA204=(Token)match(input,COMMA,FOLLOW_COMMA_in_grouping_sets_clause3308); if (state.failed) return retval; 
            	    if ( state.backtracking==0 ) stream_COMMA.add(COMMA204);


            	    pushFollow(FOLLOW_grouping_sets_elements_in_grouping_sets_clause3310);
            	    grouping_sets_elements205=grouping_sets_elements();

            	    state._fsp--;
            	    if (state.failed) return retval;
            	    if ( state.backtracking==0 ) stream_grouping_sets_elements.add(grouping_sets_elements205.getTree());

            	    }
            	    break;

            	default :
            	    break loop68;
                }
            } while (true);


            RIGHT_PAREN206=(Token)match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_grouping_sets_clause3314); if (state.failed) return retval; 
            if ( state.backtracking==0 ) stream_RIGHT_PAREN.add(RIGHT_PAREN206);


            // AST REWRITE
            // elements: grouping_sets_elements, grouping_key
            // token labels: 
            // rule labels: retval
            // token list labels: 
            // rule list labels: 
            // wildcard labels: 
            if ( state.backtracking==0 ) {

            retval.tree = root_0;
            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

            root_0 = (Object)adaptor.nil();
            // 420:9: -> ^( grouping_key ( ^( GROUPIN_SET grouping_sets_elements ) )+ )
            {
                // PLSQL_DMLParser.g:420:12: ^( grouping_key ( ^( GROUPIN_SET grouping_sets_elements ) )+ )
                {
                Object root_1 = (Object)adaptor.nil();
                root_1 = (Object)adaptor.becomeRoot(stream_grouping_key.nextNode(), root_1);

                if ( !(stream_grouping_sets_elements.hasNext()) ) {
                    throw new RewriteEarlyExitException();
                }
                while ( stream_grouping_sets_elements.hasNext() ) {
                    // PLSQL_DMLParser.g:420:27: ^( GROUPIN_SET grouping_sets_elements )
                    {
                    Object root_2 = (Object)adaptor.nil();
                    root_2 = (Object)adaptor.becomeRoot(
                    (Object)adaptor.create(GROUPIN_SET, "GROUPIN_SET")
                    , root_2);

                    adaptor.addChild(root_2, stream_grouping_sets_elements.nextTree());

                    adaptor.addChild(root_1, root_2);
                    }

                }
                stream_grouping_sets_elements.reset();

                adaptor.addChild(root_0, root_1);
                }

            }


            retval.tree = root_0;
            }

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "grouping_sets_clause"


    public static class grouping_sets_elements_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "grouping_sets_elements"
    // PLSQL_DMLParser.g:423:1: grouping_sets_elements : ( ( rollup_key | cube_key )=> rollup_cube_clause | ( LEFT_PAREN )=> expression_list | expression -> ^( EXPR expression ) );
    public final PLSQLParser_PLSQL_DMLParser.grouping_sets_elements_return grouping_sets_elements() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.grouping_sets_elements_return retval = new PLSQLParser_PLSQL_DMLParser.grouping_sets_elements_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        PLSQLParser_PLSQL_DMLParser.rollup_cube_clause_return rollup_cube_clause207 =null;

        PLSQLParser_PLSQL_DMLParser.expression_list_return expression_list208 =null;

        PLSQLParser_PLSQL_DMLParser.expression_return expression209 =null;


        RewriteRuleSubtreeStream stream_expression=new RewriteRuleSubtreeStream(adaptor,"rule expression");
        try {
            // PLSQL_DMLParser.g:424:5: ( ( rollup_key | cube_key )=> rollup_cube_clause | ( LEFT_PAREN )=> expression_list | expression -> ^( EXPR expression ) )
            int alt69=3;
            switch ( input.LA(1) ) {
            case REGULAR_ID:
                {
                int LA69_1 = input.LA(2);

                if ( (((((input.LT(1).getText().equalsIgnoreCase("cube"))||(input.LT(1).getText().equalsIgnoreCase("rollup")))&&((input.LT(1).getText().equalsIgnoreCase("cube"))||(input.LT(1).getText().equalsIgnoreCase("rollup"))))&&synpred10_PLSQL_DMLParser())) ) {
                    alt69=1;
                }
                else if ( (true) ) {
                    alt69=3;
                }
                else {
                    if (state.backtracking>0) {state.failed=true; return retval;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 69, 1, input);

                    throw nvae;

                }
                }
                break;
            case LEFT_PAREN:
                {
                int LA69_2 = input.LA(2);

                if ( (synpred11_PLSQL_DMLParser()) ) {
                    alt69=2;
                }
                else if ( (true) ) {
                    alt69=3;
                }
                else {
                    if (state.backtracking>0) {state.failed=true; return retval;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 69, 2, input);

                    throw nvae;

                }
                }
                break;
            case APPROXIMATE_NUM_LIT:
            case CHAR_STRING:
            case COLON:
            case DELIMITED_ID:
            case EXACT_NUM_LIT:
            case INTRODUCER:
            case MINUS_SIGN:
            case PLUS_SIGN:
            case SQL92_RESERVED_ALL:
            case SQL92_RESERVED_ANY:
            case SQL92_RESERVED_CASE:
            case SQL92_RESERVED_DEFAULT:
            case SQL92_RESERVED_DISTINCT:
            case SQL92_RESERVED_EXISTS:
            case SQL92_RESERVED_FALSE:
            case SQL92_RESERVED_NOT:
            case SQL92_RESERVED_NULL:
            case SQL92_RESERVED_PRIOR:
            case SQL92_RESERVED_TRUE:
            case UNSIGNED_INTEGER:
                {
                alt69=3;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return retval;}
                NoViableAltException nvae =
                    new NoViableAltException("", 69, 0, input);

                throw nvae;

            }

            switch (alt69) {
                case 1 :
                    // PLSQL_DMLParser.g:424:10: ( rollup_key | cube_key )=> rollup_cube_clause
                    {
                    root_0 = (Object)adaptor.nil();


                    pushFollow(FOLLOW_rollup_cube_clause_in_grouping_sets_elements3362);
                    rollup_cube_clause207=rollup_cube_clause();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, rollup_cube_clause207.getTree());

                    }
                    break;
                case 2 :
                    // PLSQL_DMLParser.g:425:10: ( LEFT_PAREN )=> expression_list
                    {
                    root_0 = (Object)adaptor.nil();


                    pushFollow(FOLLOW_expression_list_in_grouping_sets_elements3378);
                    expression_list208=expression_list();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, expression_list208.getTree());

                    }
                    break;
                case 3 :
                    // PLSQL_DMLParser.g:426:10: expression
                    {
                    pushFollow(FOLLOW_expression_in_grouping_sets_elements3389);
                    expression209=expression();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_expression.add(expression209.getTree());

                    // AST REWRITE
                    // elements: expression
                    // token labels: 
                    // rule labels: retval
                    // token list labels: 
                    // rule list labels: 
                    // wildcard labels: 
                    if ( state.backtracking==0 ) {

                    retval.tree = root_0;
                    RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

                    root_0 = (Object)adaptor.nil();
                    // 426:21: -> ^( EXPR expression )
                    {
                        // PLSQL_DMLParser.g:426:24: ^( EXPR expression )
                        {
                        Object root_1 = (Object)adaptor.nil();
                        root_1 = (Object)adaptor.becomeRoot(
                        (Object)adaptor.create(EXPR, "EXPR")
                        , root_1);

                        adaptor.addChild(root_1, stream_expression.nextTree());

                        adaptor.addChild(root_0, root_1);
                        }

                    }


                    retval.tree = root_0;
                    }

                    }
                    break;

            }
            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "grouping_sets_elements"


    public static class having_clause_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "having_clause"
    // PLSQL_DMLParser.g:429:1: having_clause : having_key condition -> ^( having_key ^( LOGIC_EXPR condition ) ) ;
    public final PLSQLParser_PLSQL_DMLParser.having_clause_return having_clause() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.having_clause_return retval = new PLSQLParser_PLSQL_DMLParser.having_clause_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        PLSQLParser_PLSQLKeys.having_key_return having_key210 =null;

        PLSQLParser_PLSQL_DMLParser.condition_return condition211 =null;


        RewriteRuleSubtreeStream stream_having_key=new RewriteRuleSubtreeStream(adaptor,"rule having_key");
        RewriteRuleSubtreeStream stream_condition=new RewriteRuleSubtreeStream(adaptor,"rule condition");
        try {
            // PLSQL_DMLParser.g:430:5: ( having_key condition -> ^( having_key ^( LOGIC_EXPR condition ) ) )
            // PLSQL_DMLParser.g:430:10: having_key condition
            {
            pushFollow(FOLLOW_having_key_in_having_clause3417);
            having_key210=gPLSQLParser.having_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_having_key.add(having_key210.getTree());

            pushFollow(FOLLOW_condition_in_having_clause3419);
            condition211=condition();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_condition.add(condition211.getTree());

            // AST REWRITE
            // elements: condition, having_key
            // token labels: 
            // rule labels: retval
            // token list labels: 
            // rule list labels: 
            // wildcard labels: 
            if ( state.backtracking==0 ) {

            retval.tree = root_0;
            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

            root_0 = (Object)adaptor.nil();
            // 431:9: -> ^( having_key ^( LOGIC_EXPR condition ) )
            {
                // PLSQL_DMLParser.g:431:12: ^( having_key ^( LOGIC_EXPR condition ) )
                {
                Object root_1 = (Object)adaptor.nil();
                root_1 = (Object)adaptor.becomeRoot(stream_having_key.nextNode(), root_1);

                // PLSQL_DMLParser.g:431:25: ^( LOGIC_EXPR condition )
                {
                Object root_2 = (Object)adaptor.nil();
                root_2 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(LOGIC_EXPR, "LOGIC_EXPR")
                , root_2);

                adaptor.addChild(root_2, stream_condition.nextTree());

                adaptor.addChild(root_1, root_2);
                }

                adaptor.addChild(root_0, root_1);
                }

            }


            retval.tree = root_0;
            }

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "having_clause"


    public static class model_clause_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "model_clause"
    // PLSQL_DMLParser.g:434:1: model_clause : model_key ( cell_reference_options )* ( return_rows_clause )? ( reference_model )* main_model -> ^( model_key main_model ( cell_reference_options )* ( return_rows_clause )? ( reference_model )* ) ;
    public final PLSQLParser_PLSQL_DMLParser.model_clause_return model_clause() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.model_clause_return retval = new PLSQLParser_PLSQL_DMLParser.model_clause_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        PLSQLParser_PLSQLKeys.model_key_return model_key212 =null;

        PLSQLParser_PLSQL_DMLParser.cell_reference_options_return cell_reference_options213 =null;

        PLSQLParser_PLSQL_DMLParser.return_rows_clause_return return_rows_clause214 =null;

        PLSQLParser_PLSQL_DMLParser.reference_model_return reference_model215 =null;

        PLSQLParser_PLSQL_DMLParser.main_model_return main_model216 =null;


        RewriteRuleSubtreeStream stream_return_rows_clause=new RewriteRuleSubtreeStream(adaptor,"rule return_rows_clause");
        RewriteRuleSubtreeStream stream_model_key=new RewriteRuleSubtreeStream(adaptor,"rule model_key");
        RewriteRuleSubtreeStream stream_cell_reference_options=new RewriteRuleSubtreeStream(adaptor,"rule cell_reference_options");
        RewriteRuleSubtreeStream stream_reference_model=new RewriteRuleSubtreeStream(adaptor,"rule reference_model");
        RewriteRuleSubtreeStream stream_main_model=new RewriteRuleSubtreeStream(adaptor,"rule main_model");
        try {
            // PLSQL_DMLParser.g:435:5: ( model_key ( cell_reference_options )* ( return_rows_clause )? ( reference_model )* main_model -> ^( model_key main_model ( cell_reference_options )* ( return_rows_clause )? ( reference_model )* ) )
            // PLSQL_DMLParser.g:435:10: model_key ( cell_reference_options )* ( return_rows_clause )? ( reference_model )* main_model
            {
            pushFollow(FOLLOW_model_key_in_model_clause3459);
            model_key212=gPLSQLParser.model_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_model_key.add(model_key212.getTree());

            // PLSQL_DMLParser.g:435:20: ( cell_reference_options )*
            loop70:
            do {
                int alt70=2;
                int LA70_0 = input.LA(1);

                if ( (LA70_0==REGULAR_ID) ) {
                    int LA70_1 = input.LA(2);

                    if ( (LA70_1==REGULAR_ID) ) {
                        int LA70_3 = input.LA(3);

                        if ( (((input.LT(1).getText().equalsIgnoreCase("keep"))||(input.LT(1).getText().equalsIgnoreCase("ignore")))) ) {
                            alt70=1;
                        }


                    }


                }
                else if ( (LA70_0==SQL92_RESERVED_UNIQUE) ) {
                    alt70=1;
                }


                switch (alt70) {
            	case 1 :
            	    // PLSQL_DMLParser.g:435:20: cell_reference_options
            	    {
            	    pushFollow(FOLLOW_cell_reference_options_in_model_clause3461);
            	    cell_reference_options213=cell_reference_options();

            	    state._fsp--;
            	    if (state.failed) return retval;
            	    if ( state.backtracking==0 ) stream_cell_reference_options.add(cell_reference_options213.getTree());

            	    }
            	    break;

            	default :
            	    break loop70;
                }
            } while (true);


            // PLSQL_DMLParser.g:435:44: ( return_rows_clause )?
            int alt71=2;
            int LA71_0 = input.LA(1);

            if ( (LA71_0==REGULAR_ID) ) {
                int LA71_1 = input.LA(2);

                if ( (LA71_1==REGULAR_ID) ) {
                    int LA71_2 = input.LA(3);

                    if ( (LA71_2==REGULAR_ID) ) {
                        int LA71_6 = input.LA(4);

                        if ( (LA71_6==REGULAR_ID) ) {
                            alt71=1;
                        }
                    }
                }
                else if ( (LA71_1==SQL92_RESERVED_ALL) ) {
                    alt71=1;
                }
            }
            switch (alt71) {
                case 1 :
                    // PLSQL_DMLParser.g:435:44: return_rows_clause
                    {
                    pushFollow(FOLLOW_return_rows_clause_in_model_clause3464);
                    return_rows_clause214=return_rows_clause();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_return_rows_clause.add(return_rows_clause214.getTree());

                    }
                    break;

            }


            // PLSQL_DMLParser.g:435:64: ( reference_model )*
            loop72:
            do {
                int alt72=2;
                alt72 = dfa72.predict(input);
                switch (alt72) {
            	case 1 :
            	    // PLSQL_DMLParser.g:435:64: reference_model
            	    {
            	    pushFollow(FOLLOW_reference_model_in_model_clause3467);
            	    reference_model215=reference_model();

            	    state._fsp--;
            	    if (state.failed) return retval;
            	    if ( state.backtracking==0 ) stream_reference_model.add(reference_model215.getTree());

            	    }
            	    break;

            	default :
            	    break loop72;
                }
            } while (true);


            pushFollow(FOLLOW_main_model_in_model_clause3470);
            main_model216=main_model();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_main_model.add(main_model216.getTree());

            // AST REWRITE
            // elements: return_rows_clause, reference_model, cell_reference_options, main_model, model_key
            // token labels: 
            // rule labels: retval
            // token list labels: 
            // rule list labels: 
            // wildcard labels: 
            if ( state.backtracking==0 ) {

            retval.tree = root_0;
            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

            root_0 = (Object)adaptor.nil();
            // 436:9: -> ^( model_key main_model ( cell_reference_options )* ( return_rows_clause )? ( reference_model )* )
            {
                // PLSQL_DMLParser.g:436:12: ^( model_key main_model ( cell_reference_options )* ( return_rows_clause )? ( reference_model )* )
                {
                Object root_1 = (Object)adaptor.nil();
                root_1 = (Object)adaptor.becomeRoot(stream_model_key.nextNode(), root_1);

                adaptor.addChild(root_1, stream_main_model.nextTree());

                // PLSQL_DMLParser.g:436:35: ( cell_reference_options )*
                while ( stream_cell_reference_options.hasNext() ) {
                    adaptor.addChild(root_1, stream_cell_reference_options.nextTree());

                }
                stream_cell_reference_options.reset();

                // PLSQL_DMLParser.g:436:59: ( return_rows_clause )?
                if ( stream_return_rows_clause.hasNext() ) {
                    adaptor.addChild(root_1, stream_return_rows_clause.nextTree());

                }
                stream_return_rows_clause.reset();

                // PLSQL_DMLParser.g:436:79: ( reference_model )*
                while ( stream_reference_model.hasNext() ) {
                    adaptor.addChild(root_1, stream_reference_model.nextTree());

                }
                stream_reference_model.reset();

                adaptor.addChild(root_0, root_1);
                }

            }


            retval.tree = root_0;
            }

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "model_clause"


    public static class cell_reference_options_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "cell_reference_options"
    // PLSQL_DMLParser.g:439:1: cell_reference_options : ( ( ignore_key ^| keep_key ^) nav_key | unique_key ^ ( dimension_key | single_key reference_key !) );
    public final PLSQLParser_PLSQL_DMLParser.cell_reference_options_return cell_reference_options() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.cell_reference_options_return retval = new PLSQLParser_PLSQL_DMLParser.cell_reference_options_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        PLSQLParser_PLSQLKeys.ignore_key_return ignore_key217 =null;

        PLSQLParser_PLSQLKeys.keep_key_return keep_key218 =null;

        PLSQLParser_PLSQLKeys.nav_key_return nav_key219 =null;

        PLSQLParser_PLSQLKeys.unique_key_return unique_key220 =null;

        PLSQLParser_PLSQLKeys.dimension_key_return dimension_key221 =null;

        PLSQLParser_PLSQLKeys.single_key_return single_key222 =null;

        PLSQLParser_PLSQLKeys.reference_key_return reference_key223 =null;



        try {
            // PLSQL_DMLParser.g:440:5: ( ( ignore_key ^| keep_key ^) nav_key | unique_key ^ ( dimension_key | single_key reference_key !) )
            int alt75=2;
            int LA75_0 = input.LA(1);

            if ( (LA75_0==REGULAR_ID) && (((input.LT(1).getText().equalsIgnoreCase("keep"))||(input.LT(1).getText().equalsIgnoreCase("ignore"))))) {
                alt75=1;
            }
            else if ( (LA75_0==SQL92_RESERVED_UNIQUE) ) {
                alt75=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return retval;}
                NoViableAltException nvae =
                    new NoViableAltException("", 75, 0, input);

                throw nvae;

            }
            switch (alt75) {
                case 1 :
                    // PLSQL_DMLParser.g:440:10: ( ignore_key ^| keep_key ^) nav_key
                    {
                    root_0 = (Object)adaptor.nil();


                    // PLSQL_DMLParser.g:440:10: ( ignore_key ^| keep_key ^)
                    int alt73=2;
                    int LA73_0 = input.LA(1);

                    if ( (LA73_0==REGULAR_ID) && (((input.LT(1).getText().equalsIgnoreCase("keep"))||(input.LT(1).getText().equalsIgnoreCase("ignore"))))) {
                        int LA73_1 = input.LA(2);

                        if ( ((input.LT(1).getText().equalsIgnoreCase("ignore"))) ) {
                            alt73=1;
                        }
                        else if ( ((input.LT(1).getText().equalsIgnoreCase("keep"))) ) {
                            alt73=2;
                        }
                        else {
                            if (state.backtracking>0) {state.failed=true; return retval;}
                            NoViableAltException nvae =
                                new NoViableAltException("", 73, 1, input);

                            throw nvae;

                        }
                    }
                    else {
                        if (state.backtracking>0) {state.failed=true; return retval;}
                        NoViableAltException nvae =
                            new NoViableAltException("", 73, 0, input);

                        throw nvae;

                    }
                    switch (alt73) {
                        case 1 :
                            // PLSQL_DMLParser.g:440:11: ignore_key ^
                            {
                            pushFollow(FOLLOW_ignore_key_in_cell_reference_options3516);
                            ignore_key217=gPLSQLParser.ignore_key();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) root_0 = (Object)adaptor.becomeRoot(ignore_key217.getTree(), root_0);

                            }
                            break;
                        case 2 :
                            // PLSQL_DMLParser.g:440:23: keep_key ^
                            {
                            pushFollow(FOLLOW_keep_key_in_cell_reference_options3519);
                            keep_key218=gPLSQLParser.keep_key();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) root_0 = (Object)adaptor.becomeRoot(keep_key218.getTree(), root_0);

                            }
                            break;

                    }


                    pushFollow(FOLLOW_nav_key_in_cell_reference_options3523);
                    nav_key219=gPLSQLParser.nav_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, nav_key219.getTree());

                    }
                    break;
                case 2 :
                    // PLSQL_DMLParser.g:441:10: unique_key ^ ( dimension_key | single_key reference_key !)
                    {
                    root_0 = (Object)adaptor.nil();


                    pushFollow(FOLLOW_unique_key_in_cell_reference_options3534);
                    unique_key220=gPLSQLParser.unique_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) root_0 = (Object)adaptor.becomeRoot(unique_key220.getTree(), root_0);

                    // PLSQL_DMLParser.g:441:22: ( dimension_key | single_key reference_key !)
                    int alt74=2;
                    int LA74_0 = input.LA(1);

                    if ( (LA74_0==REGULAR_ID) && (((input.LT(1).getText().equalsIgnoreCase("single"))||(input.LT(1).getText().equalsIgnoreCase("dimension"))))) {
                        int LA74_1 = input.LA(2);

                        if ( (LA74_1==REGULAR_ID) && (((input.LT(1).getText().equalsIgnoreCase("single"))||(input.LT(1).getText().equalsIgnoreCase("dimension"))))) {
                            int LA74_2 = input.LA(3);

                            if ( ((input.LT(1).getText().equalsIgnoreCase("dimension"))) ) {
                                alt74=1;
                            }
                            else if ( ((input.LT(1).getText().equalsIgnoreCase("single"))) ) {
                                alt74=2;
                            }
                            else {
                                if (state.backtracking>0) {state.failed=true; return retval;}
                                NoViableAltException nvae =
                                    new NoViableAltException("", 74, 2, input);

                                throw nvae;

                            }
                        }
                        else if ( (LA74_1==LEFT_PAREN||LA74_1==SQL92_RESERVED_UNIQUE) && ((input.LT(1).getText().equalsIgnoreCase("dimension")))) {
                            alt74=1;
                        }
                        else {
                            if (state.backtracking>0) {state.failed=true; return retval;}
                            NoViableAltException nvae =
                                new NoViableAltException("", 74, 1, input);

                            throw nvae;

                        }
                    }
                    else {
                        if (state.backtracking>0) {state.failed=true; return retval;}
                        NoViableAltException nvae =
                            new NoViableAltException("", 74, 0, input);

                        throw nvae;

                    }
                    switch (alt74) {
                        case 1 :
                            // PLSQL_DMLParser.g:441:23: dimension_key
                            {
                            pushFollow(FOLLOW_dimension_key_in_cell_reference_options3538);
                            dimension_key221=gPLSQLParser.dimension_key();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) adaptor.addChild(root_0, dimension_key221.getTree());

                            }
                            break;
                        case 2 :
                            // PLSQL_DMLParser.g:441:37: single_key reference_key !
                            {
                            pushFollow(FOLLOW_single_key_in_cell_reference_options3540);
                            single_key222=gPLSQLParser.single_key();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) adaptor.addChild(root_0, single_key222.getTree());

                            pushFollow(FOLLOW_reference_key_in_cell_reference_options3542);
                            reference_key223=gPLSQLParser.reference_key();

                            state._fsp--;
                            if (state.failed) return retval;

                            }
                            break;

                    }


                    }
                    break;

            }
            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "cell_reference_options"


    public static class return_rows_clause_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "return_rows_clause"
    // PLSQL_DMLParser.g:444:1: return_rows_clause : return_key ^ ( updated_key | all_key ) rows_key !;
    public final PLSQLParser_PLSQL_DMLParser.return_rows_clause_return return_rows_clause() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.return_rows_clause_return retval = new PLSQLParser_PLSQL_DMLParser.return_rows_clause_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        PLSQLParser_PLSQLKeys.return_key_return return_key224 =null;

        PLSQLParser_PLSQLKeys.updated_key_return updated_key225 =null;

        PLSQLParser_PLSQLKeys.all_key_return all_key226 =null;

        PLSQLParser_PLSQLKeys.rows_key_return rows_key227 =null;



        try {
            // PLSQL_DMLParser.g:445:5: ( return_key ^ ( updated_key | all_key ) rows_key !)
            // PLSQL_DMLParser.g:445:10: return_key ^ ( updated_key | all_key ) rows_key !
            {
            root_0 = (Object)adaptor.nil();


            pushFollow(FOLLOW_return_key_in_return_rows_clause3565);
            return_key224=gPLSQLParser.return_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) root_0 = (Object)adaptor.becomeRoot(return_key224.getTree(), root_0);

            // PLSQL_DMLParser.g:445:22: ( updated_key | all_key )
            int alt76=2;
            int LA76_0 = input.LA(1);

            if ( (LA76_0==REGULAR_ID) && ((input.LT(1).getText().equalsIgnoreCase("updated")))) {
                alt76=1;
            }
            else if ( (LA76_0==SQL92_RESERVED_ALL) ) {
                alt76=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return retval;}
                NoViableAltException nvae =
                    new NoViableAltException("", 76, 0, input);

                throw nvae;

            }
            switch (alt76) {
                case 1 :
                    // PLSQL_DMLParser.g:445:23: updated_key
                    {
                    pushFollow(FOLLOW_updated_key_in_return_rows_clause3569);
                    updated_key225=gPLSQLParser.updated_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, updated_key225.getTree());

                    }
                    break;
                case 2 :
                    // PLSQL_DMLParser.g:445:35: all_key
                    {
                    pushFollow(FOLLOW_all_key_in_return_rows_clause3571);
                    all_key226=gPLSQLParser.all_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, all_key226.getTree());

                    }
                    break;

            }


            pushFollow(FOLLOW_rows_key_in_return_rows_clause3574);
            rows_key227=gPLSQLParser.rows_key();

            state._fsp--;
            if (state.failed) return retval;

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "return_rows_clause"


    public static class reference_model_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "reference_model"
    // PLSQL_DMLParser.g:448:1: reference_model : reference_key ^ reference_model_name on_key ! LEFT_PAREN ! subquery RIGHT_PAREN ! model_column_clauses ( cell_reference_options )* ;
    public final PLSQLParser_PLSQL_DMLParser.reference_model_return reference_model() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.reference_model_return retval = new PLSQLParser_PLSQL_DMLParser.reference_model_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token LEFT_PAREN231=null;
        Token RIGHT_PAREN233=null;
        PLSQLParser_PLSQLKeys.reference_key_return reference_key228 =null;

        PLSQLParser_PLSQLCommons.reference_model_name_return reference_model_name229 =null;

        PLSQLParser_PLSQLKeys.on_key_return on_key230 =null;

        PLSQLParser_PLSQL_DMLParser.subquery_return subquery232 =null;

        PLSQLParser_PLSQL_DMLParser.model_column_clauses_return model_column_clauses234 =null;

        PLSQLParser_PLSQL_DMLParser.cell_reference_options_return cell_reference_options235 =null;


        Object LEFT_PAREN231_tree=null;
        Object RIGHT_PAREN233_tree=null;

        try {
            // PLSQL_DMLParser.g:449:5: ( reference_key ^ reference_model_name on_key ! LEFT_PAREN ! subquery RIGHT_PAREN ! model_column_clauses ( cell_reference_options )* )
            // PLSQL_DMLParser.g:449:10: reference_key ^ reference_model_name on_key ! LEFT_PAREN ! subquery RIGHT_PAREN ! model_column_clauses ( cell_reference_options )*
            {
            root_0 = (Object)adaptor.nil();


            pushFollow(FOLLOW_reference_key_in_reference_model3595);
            reference_key228=gPLSQLParser.reference_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) root_0 = (Object)adaptor.becomeRoot(reference_key228.getTree(), root_0);

            pushFollow(FOLLOW_reference_model_name_in_reference_model3598);
            reference_model_name229=gPLSQLParser.reference_model_name();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) adaptor.addChild(root_0, reference_model_name229.getTree());

            pushFollow(FOLLOW_on_key_in_reference_model3600);
            on_key230=gPLSQLParser.on_key();

            state._fsp--;
            if (state.failed) return retval;

            LEFT_PAREN231=(Token)match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_reference_model3616); if (state.failed) return retval;

            pushFollow(FOLLOW_subquery_in_reference_model3619);
            subquery232=subquery();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) adaptor.addChild(root_0, subquery232.getTree());

            RIGHT_PAREN233=(Token)match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_reference_model3621); if (state.failed) return retval;

            pushFollow(FOLLOW_model_column_clauses_in_reference_model3624);
            model_column_clauses234=model_column_clauses();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) adaptor.addChild(root_0, model_column_clauses234.getTree());

            // PLSQL_DMLParser.g:451:13: ( cell_reference_options )*
            loop77:
            do {
                int alt77=2;
                int LA77_0 = input.LA(1);

                if ( (LA77_0==REGULAR_ID) && (((input.LT(1).getText().equalsIgnoreCase("reference"))||(input.LT(1).getText().equalsIgnoreCase("dimension"))||(input.LT(1).getText().equalsIgnoreCase("keep"))||(input.LT(1).getText().equalsIgnoreCase("main"))||(input.LT(1).getText().equalsIgnoreCase("partition"))||(input.LT(1).getText().equalsIgnoreCase("ignore"))))) {
                    int LA77_1 = input.LA(2);

                    if ( (LA77_1==REGULAR_ID) && (((input.LT(1).getText().equalsIgnoreCase("reference"))||(input.LT(1).getText().equalsIgnoreCase("keep"))||(input.LT(1).getText().equalsIgnoreCase("main"))||(input.LT(1).getText().equalsIgnoreCase("ignore"))))) {
                        int LA77_4 = input.LA(3);

                        if ( (((input.LT(1).getText().equalsIgnoreCase("keep"))||(input.LT(1).getText().equalsIgnoreCase("ignore")))) ) {
                            alt77=1;
                        }


                    }


                }
                else if ( (LA77_0==SQL92_RESERVED_UNIQUE) ) {
                    alt77=1;
                }


                switch (alt77) {
            	case 1 :
            	    // PLSQL_DMLParser.g:451:13: cell_reference_options
            	    {
            	    pushFollow(FOLLOW_cell_reference_options_in_reference_model3639);
            	    cell_reference_options235=cell_reference_options();

            	    state._fsp--;
            	    if (state.failed) return retval;
            	    if ( state.backtracking==0 ) adaptor.addChild(root_0, cell_reference_options235.getTree());

            	    }
            	    break;

            	default :
            	    break loop77;
                }
            } while (true);


            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "reference_model"


    public static class main_model_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "main_model"
    // PLSQL_DMLParser.g:454:1: main_model : ( main_key main_model_name )? model_column_clauses ( cell_reference_options )* model_rules_clause -> ^( MAIN_MODEL ( main_model_name )? model_column_clauses model_rules_clause ( cell_reference_options )* ) ;
    public final PLSQLParser_PLSQL_DMLParser.main_model_return main_model() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.main_model_return retval = new PLSQLParser_PLSQL_DMLParser.main_model_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        PLSQLParser_PLSQLKeys.main_key_return main_key236 =null;

        PLSQLParser_PLSQLCommons.main_model_name_return main_model_name237 =null;

        PLSQLParser_PLSQL_DMLParser.model_column_clauses_return model_column_clauses238 =null;

        PLSQLParser_PLSQL_DMLParser.cell_reference_options_return cell_reference_options239 =null;

        PLSQLParser_PLSQL_DMLParser.model_rules_clause_return model_rules_clause240 =null;


        RewriteRuleSubtreeStream stream_main_key=new RewriteRuleSubtreeStream(adaptor,"rule main_key");
        RewriteRuleSubtreeStream stream_main_model_name=new RewriteRuleSubtreeStream(adaptor,"rule main_model_name");
        RewriteRuleSubtreeStream stream_model_column_clauses=new RewriteRuleSubtreeStream(adaptor,"rule model_column_clauses");
        RewriteRuleSubtreeStream stream_cell_reference_options=new RewriteRuleSubtreeStream(adaptor,"rule cell_reference_options");
        RewriteRuleSubtreeStream stream_model_rules_clause=new RewriteRuleSubtreeStream(adaptor,"rule model_rules_clause");
        try {
            // PLSQL_DMLParser.g:455:5: ( ( main_key main_model_name )? model_column_clauses ( cell_reference_options )* model_rules_clause -> ^( MAIN_MODEL ( main_model_name )? model_column_clauses model_rules_clause ( cell_reference_options )* ) )
            // PLSQL_DMLParser.g:455:10: ( main_key main_model_name )? model_column_clauses ( cell_reference_options )* model_rules_clause
            {
            // PLSQL_DMLParser.g:455:10: ( main_key main_model_name )?
            int alt78=2;
            int LA78_0 = input.LA(1);

            if ( (LA78_0==REGULAR_ID) && (((input.LT(1).getText().equalsIgnoreCase("dimension"))||(input.LT(1).getText().equalsIgnoreCase("main"))||(input.LT(1).getText().equalsIgnoreCase("partition"))))) {
                int LA78_1 = input.LA(2);

                if ( (LA78_1==DELIMITED_ID||LA78_1==INTRODUCER||LA78_1==REGULAR_ID) && ((input.LT(1).getText().equalsIgnoreCase("main")))) {
                    alt78=1;
                }
            }
            switch (alt78) {
                case 1 :
                    // PLSQL_DMLParser.g:455:11: main_key main_model_name
                    {
                    pushFollow(FOLLOW_main_key_in_main_model3661);
                    main_key236=gPLSQLParser.main_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_main_key.add(main_key236.getTree());

                    pushFollow(FOLLOW_main_model_name_in_main_model3663);
                    main_model_name237=gPLSQLParser.main_model_name();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_main_model_name.add(main_model_name237.getTree());

                    }
                    break;

            }


            pushFollow(FOLLOW_model_column_clauses_in_main_model3667);
            model_column_clauses238=model_column_clauses();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_model_column_clauses.add(model_column_clauses238.getTree());

            // PLSQL_DMLParser.g:455:59: ( cell_reference_options )*
            loop79:
            do {
                int alt79=2;
                int LA79_0 = input.LA(1);

                if ( (LA79_0==REGULAR_ID) && (((input.LT(1).getText().equalsIgnoreCase("rules"))||(input.LT(1).getText().equalsIgnoreCase("keep"))||(input.LT(1).getText().equalsIgnoreCase("ignore"))))) {
                    int LA79_1 = input.LA(2);

                    if ( (LA79_1==REGULAR_ID) && (((input.LT(1).getText().equalsIgnoreCase("rules"))||(input.LT(1).getText().equalsIgnoreCase("keep"))||(input.LT(1).getText().equalsIgnoreCase("ignore"))))) {
                        int LA79_5 = input.LA(3);

                        if ( (((input.LT(1).getText().equalsIgnoreCase("keep"))||(input.LT(1).getText().equalsIgnoreCase("ignore")))) ) {
                            alt79=1;
                        }


                    }


                }
                else if ( (LA79_0==SQL92_RESERVED_UNIQUE) ) {
                    alt79=1;
                }


                switch (alt79) {
            	case 1 :
            	    // PLSQL_DMLParser.g:455:59: cell_reference_options
            	    {
            	    pushFollow(FOLLOW_cell_reference_options_in_main_model3669);
            	    cell_reference_options239=cell_reference_options();

            	    state._fsp--;
            	    if (state.failed) return retval;
            	    if ( state.backtracking==0 ) stream_cell_reference_options.add(cell_reference_options239.getTree());

            	    }
            	    break;

            	default :
            	    break loop79;
                }
            } while (true);


            pushFollow(FOLLOW_model_rules_clause_in_main_model3672);
            model_rules_clause240=model_rules_clause();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_model_rules_clause.add(model_rules_clause240.getTree());

            // AST REWRITE
            // elements: model_rules_clause, cell_reference_options, model_column_clauses, main_model_name
            // token labels: 
            // rule labels: retval
            // token list labels: 
            // rule list labels: 
            // wildcard labels: 
            if ( state.backtracking==0 ) {

            retval.tree = root_0;
            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

            root_0 = (Object)adaptor.nil();
            // 456:9: -> ^( MAIN_MODEL ( main_model_name )? model_column_clauses model_rules_clause ( cell_reference_options )* )
            {
                // PLSQL_DMLParser.g:456:12: ^( MAIN_MODEL ( main_model_name )? model_column_clauses model_rules_clause ( cell_reference_options )* )
                {
                Object root_1 = (Object)adaptor.nil();
                root_1 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(MAIN_MODEL, "MAIN_MODEL")
                , root_1);

                // PLSQL_DMLParser.g:456:25: ( main_model_name )?
                if ( stream_main_model_name.hasNext() ) {
                    adaptor.addChild(root_1, stream_main_model_name.nextTree());

                }
                stream_main_model_name.reset();

                adaptor.addChild(root_1, stream_model_column_clauses.nextTree());

                adaptor.addChild(root_1, stream_model_rules_clause.nextTree());

                // PLSQL_DMLParser.g:456:82: ( cell_reference_options )*
                while ( stream_cell_reference_options.hasNext() ) {
                    adaptor.addChild(root_1, stream_cell_reference_options.nextTree());

                }
                stream_cell_reference_options.reset();

                adaptor.addChild(root_0, root_1);
                }

            }


            retval.tree = root_0;
            }

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "main_model"


    public static class model_column_clauses_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "model_column_clauses"
    // PLSQL_DMLParser.g:459:1: model_column_clauses : ( model_column_partition_part )? dimension_key by_key model_column_list measures_key model_column_list -> ^( MODEL_COLUMN ^( dimension_key model_column_list ) ^( measures_key model_column_list ) ( model_column_partition_part )? ) ;
    public final PLSQLParser_PLSQL_DMLParser.model_column_clauses_return model_column_clauses() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.model_column_clauses_return retval = new PLSQLParser_PLSQL_DMLParser.model_column_clauses_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        PLSQLParser_PLSQL_DMLParser.model_column_partition_part_return model_column_partition_part241 =null;

        PLSQLParser_PLSQLKeys.dimension_key_return dimension_key242 =null;

        PLSQLParser_PLSQLKeys.by_key_return by_key243 =null;

        PLSQLParser_PLSQL_DMLParser.model_column_list_return model_column_list244 =null;

        PLSQLParser_PLSQLKeys.measures_key_return measures_key245 =null;

        PLSQLParser_PLSQL_DMLParser.model_column_list_return model_column_list246 =null;


        RewriteRuleSubtreeStream stream_model_column_list=new RewriteRuleSubtreeStream(adaptor,"rule model_column_list");
        RewriteRuleSubtreeStream stream_dimension_key=new RewriteRuleSubtreeStream(adaptor,"rule dimension_key");
        RewriteRuleSubtreeStream stream_by_key=new RewriteRuleSubtreeStream(adaptor,"rule by_key");
        RewriteRuleSubtreeStream stream_model_column_partition_part=new RewriteRuleSubtreeStream(adaptor,"rule model_column_partition_part");
        RewriteRuleSubtreeStream stream_measures_key=new RewriteRuleSubtreeStream(adaptor,"rule measures_key");
        try {
            // PLSQL_DMLParser.g:460:5: ( ( model_column_partition_part )? dimension_key by_key model_column_list measures_key model_column_list -> ^( MODEL_COLUMN ^( dimension_key model_column_list ) ^( measures_key model_column_list ) ( model_column_partition_part )? ) )
            // PLSQL_DMLParser.g:460:10: ( model_column_partition_part )? dimension_key by_key model_column_list measures_key model_column_list
            {
            // PLSQL_DMLParser.g:460:10: ( model_column_partition_part )?
            int alt80=2;
            int LA80_0 = input.LA(1);

            if ( (LA80_0==REGULAR_ID) && (((input.LT(1).getText().equalsIgnoreCase("dimension"))||(input.LT(1).getText().equalsIgnoreCase("partition"))))) {
                int LA80_1 = input.LA(2);

                if ( ((input.LT(1).getText().equalsIgnoreCase("partition"))) ) {
                    alt80=1;
                }
            }
            switch (alt80) {
                case 1 :
                    // PLSQL_DMLParser.g:460:10: model_column_partition_part
                    {
                    pushFollow(FOLLOW_model_column_partition_part_in_model_column_clauses3716);
                    model_column_partition_part241=model_column_partition_part();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_model_column_partition_part.add(model_column_partition_part241.getTree());

                    }
                    break;

            }


            pushFollow(FOLLOW_dimension_key_in_model_column_clauses3727);
            dimension_key242=gPLSQLParser.dimension_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_dimension_key.add(dimension_key242.getTree());

            pushFollow(FOLLOW_by_key_in_model_column_clauses3729);
            by_key243=gPLSQLParser.by_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_by_key.add(by_key243.getTree());

            pushFollow(FOLLOW_model_column_list_in_model_column_clauses3731);
            model_column_list244=model_column_list();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_model_column_list.add(model_column_list244.getTree());

            pushFollow(FOLLOW_measures_key_in_model_column_clauses3733);
            measures_key245=gPLSQLParser.measures_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_measures_key.add(measures_key245.getTree());

            pushFollow(FOLLOW_model_column_list_in_model_column_clauses3735);
            model_column_list246=model_column_list();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_model_column_list.add(model_column_list246.getTree());

            // AST REWRITE
            // elements: dimension_key, model_column_list, model_column_partition_part, model_column_list, measures_key
            // token labels: 
            // rule labels: retval
            // token list labels: 
            // rule list labels: 
            // wildcard labels: 
            if ( state.backtracking==0 ) {

            retval.tree = root_0;
            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

            root_0 = (Object)adaptor.nil();
            // 462:9: -> ^( MODEL_COLUMN ^( dimension_key model_column_list ) ^( measures_key model_column_list ) ( model_column_partition_part )? )
            {
                // PLSQL_DMLParser.g:462:12: ^( MODEL_COLUMN ^( dimension_key model_column_list ) ^( measures_key model_column_list ) ( model_column_partition_part )? )
                {
                Object root_1 = (Object)adaptor.nil();
                root_1 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(MODEL_COLUMN, "MODEL_COLUMN")
                , root_1);

                // PLSQL_DMLParser.g:462:27: ^( dimension_key model_column_list )
                {
                Object root_2 = (Object)adaptor.nil();
                root_2 = (Object)adaptor.becomeRoot(stream_dimension_key.nextNode(), root_2);

                adaptor.addChild(root_2, stream_model_column_list.nextTree());

                adaptor.addChild(root_1, root_2);
                }

                // PLSQL_DMLParser.g:462:62: ^( measures_key model_column_list )
                {
                Object root_2 = (Object)adaptor.nil();
                root_2 = (Object)adaptor.becomeRoot(stream_measures_key.nextNode(), root_2);

                adaptor.addChild(root_2, stream_model_column_list.nextTree());

                adaptor.addChild(root_1, root_2);
                }

                // PLSQL_DMLParser.g:462:96: ( model_column_partition_part )?
                if ( stream_model_column_partition_part.hasNext() ) {
                    adaptor.addChild(root_1, stream_model_column_partition_part.nextTree());

                }
                stream_model_column_partition_part.reset();

                adaptor.addChild(root_0, root_1);
                }

            }


            retval.tree = root_0;
            }

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "model_column_clauses"


    public static class model_column_partition_part_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "model_column_partition_part"
    // PLSQL_DMLParser.g:465:1: model_column_partition_part : partition_key ^ by_key ! model_column_list ;
    public final PLSQLParser_PLSQL_DMLParser.model_column_partition_part_return model_column_partition_part() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.model_column_partition_part_return retval = new PLSQLParser_PLSQL_DMLParser.model_column_partition_part_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        PLSQLParser_PLSQLKeys.partition_key_return partition_key247 =null;

        PLSQLParser_PLSQLKeys.by_key_return by_key248 =null;

        PLSQLParser_PLSQL_DMLParser.model_column_list_return model_column_list249 =null;



        try {
            // PLSQL_DMLParser.g:466:5: ( partition_key ^ by_key ! model_column_list )
            // PLSQL_DMLParser.g:466:10: partition_key ^ by_key ! model_column_list
            {
            root_0 = (Object)adaptor.nil();


            pushFollow(FOLLOW_partition_key_in_model_column_partition_part3784);
            partition_key247=gPLSQLParser.partition_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) root_0 = (Object)adaptor.becomeRoot(partition_key247.getTree(), root_0);

            pushFollow(FOLLOW_by_key_in_model_column_partition_part3787);
            by_key248=gPLSQLParser.by_key();

            state._fsp--;
            if (state.failed) return retval;

            pushFollow(FOLLOW_model_column_list_in_model_column_partition_part3790);
            model_column_list249=model_column_list();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) adaptor.addChild(root_0, model_column_list249.getTree());

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "model_column_partition_part"


    public static class model_column_list_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "model_column_list"
    // PLSQL_DMLParser.g:469:1: model_column_list : LEFT_PAREN model_column ( COMMA model_column )* RIGHT_PAREN -> ^( MODEL_COLUMNS ( model_column )+ ) ;
    public final PLSQLParser_PLSQL_DMLParser.model_column_list_return model_column_list() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.model_column_list_return retval = new PLSQLParser_PLSQL_DMLParser.model_column_list_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token LEFT_PAREN250=null;
        Token COMMA252=null;
        Token RIGHT_PAREN254=null;
        PLSQLParser_PLSQL_DMLParser.model_column_return model_column251 =null;

        PLSQLParser_PLSQL_DMLParser.model_column_return model_column253 =null;


        Object LEFT_PAREN250_tree=null;
        Object COMMA252_tree=null;
        Object RIGHT_PAREN254_tree=null;
        RewriteRuleTokenStream stream_LEFT_PAREN=new RewriteRuleTokenStream(adaptor,"token LEFT_PAREN");
        RewriteRuleTokenStream stream_RIGHT_PAREN=new RewriteRuleTokenStream(adaptor,"token RIGHT_PAREN");
        RewriteRuleTokenStream stream_COMMA=new RewriteRuleTokenStream(adaptor,"token COMMA");
        RewriteRuleSubtreeStream stream_model_column=new RewriteRuleSubtreeStream(adaptor,"rule model_column");
        try {
            // PLSQL_DMLParser.g:470:5: ( LEFT_PAREN model_column ( COMMA model_column )* RIGHT_PAREN -> ^( MODEL_COLUMNS ( model_column )+ ) )
            // PLSQL_DMLParser.g:470:10: LEFT_PAREN model_column ( COMMA model_column )* RIGHT_PAREN
            {
            LEFT_PAREN250=(Token)match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_model_column_list3810); if (state.failed) return retval; 
            if ( state.backtracking==0 ) stream_LEFT_PAREN.add(LEFT_PAREN250);


            pushFollow(FOLLOW_model_column_in_model_column_list3812);
            model_column251=model_column();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_model_column.add(model_column251.getTree());

            // PLSQL_DMLParser.g:470:34: ( COMMA model_column )*
            loop81:
            do {
                int alt81=2;
                int LA81_0 = input.LA(1);

                if ( (LA81_0==COMMA) ) {
                    alt81=1;
                }


                switch (alt81) {
            	case 1 :
            	    // PLSQL_DMLParser.g:470:35: COMMA model_column
            	    {
            	    COMMA252=(Token)match(input,COMMA,FOLLOW_COMMA_in_model_column_list3815); if (state.failed) return retval; 
            	    if ( state.backtracking==0 ) stream_COMMA.add(COMMA252);


            	    pushFollow(FOLLOW_model_column_in_model_column_list3817);
            	    model_column253=model_column();

            	    state._fsp--;
            	    if (state.failed) return retval;
            	    if ( state.backtracking==0 ) stream_model_column.add(model_column253.getTree());

            	    }
            	    break;

            	default :
            	    break loop81;
                }
            } while (true);


            RIGHT_PAREN254=(Token)match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_model_column_list3822); if (state.failed) return retval; 
            if ( state.backtracking==0 ) stream_RIGHT_PAREN.add(RIGHT_PAREN254);


            // AST REWRITE
            // elements: model_column
            // token labels: 
            // rule labels: retval
            // token list labels: 
            // rule list labels: 
            // wildcard labels: 
            if ( state.backtracking==0 ) {

            retval.tree = root_0;
            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

            root_0 = (Object)adaptor.nil();
            // 471:9: -> ^( MODEL_COLUMNS ( model_column )+ )
            {
                // PLSQL_DMLParser.g:471:12: ^( MODEL_COLUMNS ( model_column )+ )
                {
                Object root_1 = (Object)adaptor.nil();
                root_1 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(MODEL_COLUMNS, "MODEL_COLUMNS")
                , root_1);

                if ( !(stream_model_column.hasNext()) ) {
                    throw new RewriteEarlyExitException();
                }
                while ( stream_model_column.hasNext() ) {
                    adaptor.addChild(root_1, stream_model_column.nextTree());

                }
                stream_model_column.reset();

                adaptor.addChild(root_0, root_1);
                }

            }


            retval.tree = root_0;
            }

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "model_column_list"


    public static class model_column_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "model_column"
    // PLSQL_DMLParser.g:474:1: model_column : expression ( alias )? -> ^( MODEL_COLUMN ( alias )? ^( EXPR expression ) ) ;
    public final PLSQLParser_PLSQL_DMLParser.model_column_return model_column() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.model_column_return retval = new PLSQLParser_PLSQL_DMLParser.model_column_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        PLSQLParser_PLSQL_DMLParser.expression_return expression255 =null;

        PLSQLParser_PLSQLCommons.alias_return alias256 =null;


        RewriteRuleSubtreeStream stream_expression=new RewriteRuleSubtreeStream(adaptor,"rule expression");
        RewriteRuleSubtreeStream stream_alias=new RewriteRuleSubtreeStream(adaptor,"rule alias");
        try {
            // PLSQL_DMLParser.g:475:5: ( expression ( alias )? -> ^( MODEL_COLUMN ( alias )? ^( EXPR expression ) ) )
            // PLSQL_DMLParser.g:475:10: expression ( alias )?
            {
            pushFollow(FOLLOW_expression_in_model_column3859);
            expression255=expression();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_expression.add(expression255.getTree());

            // PLSQL_DMLParser.g:475:21: ( alias )?
            int alt82=2;
            int LA82_0 = input.LA(1);

            if ( (LA82_0==CHAR_STRING||LA82_0==DELIMITED_ID||LA82_0==INTRODUCER||LA82_0==REGULAR_ID||LA82_0==SQL92_RESERVED_AS) ) {
                alt82=1;
            }
            switch (alt82) {
                case 1 :
                    // PLSQL_DMLParser.g:475:21: alias
                    {
                    pushFollow(FOLLOW_alias_in_model_column3861);
                    alias256=gPLSQLParser.alias();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_alias.add(alias256.getTree());

                    }
                    break;

            }


            // AST REWRITE
            // elements: expression, alias
            // token labels: 
            // rule labels: retval
            // token list labels: 
            // rule list labels: 
            // wildcard labels: 
            if ( state.backtracking==0 ) {

            retval.tree = root_0;
            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

            root_0 = (Object)adaptor.nil();
            // 476:9: -> ^( MODEL_COLUMN ( alias )? ^( EXPR expression ) )
            {
                // PLSQL_DMLParser.g:476:12: ^( MODEL_COLUMN ( alias )? ^( EXPR expression ) )
                {
                Object root_1 = (Object)adaptor.nil();
                root_1 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(MODEL_COLUMN, "MODEL_COLUMN")
                , root_1);

                // PLSQL_DMLParser.g:476:27: ( alias )?
                if ( stream_alias.hasNext() ) {
                    adaptor.addChild(root_1, stream_alias.nextTree());

                }
                stream_alias.reset();

                // PLSQL_DMLParser.g:476:34: ^( EXPR expression )
                {
                Object root_2 = (Object)adaptor.nil();
                root_2 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(EXPR, "EXPR")
                , root_2);

                adaptor.addChild(root_2, stream_expression.nextTree());

                adaptor.addChild(root_1, root_2);
                }

                adaptor.addChild(root_0, root_1);
                }

            }


            retval.tree = root_0;
            }

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "model_column"


    public static class model_rules_clause_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "model_rules_clause"
    // PLSQL_DMLParser.g:479:1: model_rules_clause : ( model_rules_part )? LEFT_PAREN model_rules_element ( COMMA model_rules_element )* RIGHT_PAREN -> ^( MODEL_RULES ( model_rules_element )+ ( model_rules_part )? ) ;
    public final PLSQLParser_PLSQL_DMLParser.model_rules_clause_return model_rules_clause() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.model_rules_clause_return retval = new PLSQLParser_PLSQL_DMLParser.model_rules_clause_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token LEFT_PAREN258=null;
        Token COMMA260=null;
        Token RIGHT_PAREN262=null;
        PLSQLParser_PLSQL_DMLParser.model_rules_part_return model_rules_part257 =null;

        PLSQLParser_PLSQL_DMLParser.model_rules_element_return model_rules_element259 =null;

        PLSQLParser_PLSQL_DMLParser.model_rules_element_return model_rules_element261 =null;


        Object LEFT_PAREN258_tree=null;
        Object COMMA260_tree=null;
        Object RIGHT_PAREN262_tree=null;
        RewriteRuleTokenStream stream_LEFT_PAREN=new RewriteRuleTokenStream(adaptor,"token LEFT_PAREN");
        RewriteRuleTokenStream stream_RIGHT_PAREN=new RewriteRuleTokenStream(adaptor,"token RIGHT_PAREN");
        RewriteRuleTokenStream stream_COMMA=new RewriteRuleTokenStream(adaptor,"token COMMA");
        RewriteRuleSubtreeStream stream_model_rules_element=new RewriteRuleSubtreeStream(adaptor,"rule model_rules_element");
        RewriteRuleSubtreeStream stream_model_rules_part=new RewriteRuleSubtreeStream(adaptor,"rule model_rules_part");
        try {
            // PLSQL_DMLParser.g:480:5: ( ( model_rules_part )? LEFT_PAREN model_rules_element ( COMMA model_rules_element )* RIGHT_PAREN -> ^( MODEL_RULES ( model_rules_element )+ ( model_rules_part )? ) )
            // PLSQL_DMLParser.g:480:10: ( model_rules_part )? LEFT_PAREN model_rules_element ( COMMA model_rules_element )* RIGHT_PAREN
            {
            // PLSQL_DMLParser.g:480:10: ( model_rules_part )?
            int alt83=2;
            int LA83_0 = input.LA(1);

            if ( (LA83_0==REGULAR_ID) && ((input.LT(1).getText().equalsIgnoreCase("rules")))) {
                alt83=1;
            }
            switch (alt83) {
                case 1 :
                    // PLSQL_DMLParser.g:480:10: model_rules_part
                    {
                    pushFollow(FOLLOW_model_rules_part_in_model_rules_clause3906);
                    model_rules_part257=model_rules_part();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_model_rules_part.add(model_rules_part257.getTree());

                    }
                    break;

            }


            LEFT_PAREN258=(Token)match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_model_rules_clause3909); if (state.failed) return retval; 
            if ( state.backtracking==0 ) stream_LEFT_PAREN.add(LEFT_PAREN258);


            pushFollow(FOLLOW_model_rules_element_in_model_rules_clause3911);
            model_rules_element259=model_rules_element();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_model_rules_element.add(model_rules_element259.getTree());

            // PLSQL_DMLParser.g:480:59: ( COMMA model_rules_element )*
            loop84:
            do {
                int alt84=2;
                int LA84_0 = input.LA(1);

                if ( (LA84_0==COMMA) ) {
                    alt84=1;
                }


                switch (alt84) {
            	case 1 :
            	    // PLSQL_DMLParser.g:480:60: COMMA model_rules_element
            	    {
            	    COMMA260=(Token)match(input,COMMA,FOLLOW_COMMA_in_model_rules_clause3914); if (state.failed) return retval; 
            	    if ( state.backtracking==0 ) stream_COMMA.add(COMMA260);


            	    pushFollow(FOLLOW_model_rules_element_in_model_rules_clause3916);
            	    model_rules_element261=model_rules_element();

            	    state._fsp--;
            	    if (state.failed) return retval;
            	    if ( state.backtracking==0 ) stream_model_rules_element.add(model_rules_element261.getTree());

            	    }
            	    break;

            	default :
            	    break loop84;
                }
            } while (true);


            RIGHT_PAREN262=(Token)match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_model_rules_clause3920); if (state.failed) return retval; 
            if ( state.backtracking==0 ) stream_RIGHT_PAREN.add(RIGHT_PAREN262);


            // AST REWRITE
            // elements: model_rules_part, model_rules_element
            // token labels: 
            // rule labels: retval
            // token list labels: 
            // rule list labels: 
            // wildcard labels: 
            if ( state.backtracking==0 ) {

            retval.tree = root_0;
            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

            root_0 = (Object)adaptor.nil();
            // 481:9: -> ^( MODEL_RULES ( model_rules_element )+ ( model_rules_part )? )
            {
                // PLSQL_DMLParser.g:481:12: ^( MODEL_RULES ( model_rules_element )+ ( model_rules_part )? )
                {
                Object root_1 = (Object)adaptor.nil();
                root_1 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(MODEL_RULES, "MODEL_RULES")
                , root_1);

                if ( !(stream_model_rules_element.hasNext()) ) {
                    throw new RewriteEarlyExitException();
                }
                while ( stream_model_rules_element.hasNext() ) {
                    adaptor.addChild(root_1, stream_model_rules_element.nextTree());

                }
                stream_model_rules_element.reset();

                // PLSQL_DMLParser.g:481:47: ( model_rules_part )?
                if ( stream_model_rules_part.hasNext() ) {
                    adaptor.addChild(root_1, stream_model_rules_part.nextTree());

                }
                stream_model_rules_part.reset();

                adaptor.addChild(root_0, root_1);
                }

            }


            retval.tree = root_0;
            }

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "model_rules_clause"


    public static class model_rules_part_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "model_rules_part"
    // PLSQL_DMLParser.g:484:1: model_rules_part : rules_key ( update_key | upsert_key ( all_key )? )? ( ( automatic_key | sequential_key ) order_key )? ( model_iterate_clause )? -> ^( rules_key ( update_key )? ( upsert_key )? ( all_key )? ( automatic_key )? ( sequential_key )? ( model_iterate_clause )? ) ;
    public final PLSQLParser_PLSQL_DMLParser.model_rules_part_return model_rules_part() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.model_rules_part_return retval = new PLSQLParser_PLSQL_DMLParser.model_rules_part_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        PLSQLParser_PLSQLKeys.rules_key_return rules_key263 =null;

        PLSQLParser_PLSQLKeys.update_key_return update_key264 =null;

        PLSQLParser_PLSQLKeys.upsert_key_return upsert_key265 =null;

        PLSQLParser_PLSQLKeys.all_key_return all_key266 =null;

        PLSQLParser_PLSQLKeys.automatic_key_return automatic_key267 =null;

        PLSQLParser_PLSQLKeys.sequential_key_return sequential_key268 =null;

        PLSQLParser_PLSQLKeys.order_key_return order_key269 =null;

        PLSQLParser_PLSQL_DMLParser.model_iterate_clause_return model_iterate_clause270 =null;


        RewriteRuleSubtreeStream stream_all_key=new RewriteRuleSubtreeStream(adaptor,"rule all_key");
        RewriteRuleSubtreeStream stream_sequential_key=new RewriteRuleSubtreeStream(adaptor,"rule sequential_key");
        RewriteRuleSubtreeStream stream_order_key=new RewriteRuleSubtreeStream(adaptor,"rule order_key");
        RewriteRuleSubtreeStream stream_rules_key=new RewriteRuleSubtreeStream(adaptor,"rule rules_key");
        RewriteRuleSubtreeStream stream_model_iterate_clause=new RewriteRuleSubtreeStream(adaptor,"rule model_iterate_clause");
        RewriteRuleSubtreeStream stream_update_key=new RewriteRuleSubtreeStream(adaptor,"rule update_key");
        RewriteRuleSubtreeStream stream_automatic_key=new RewriteRuleSubtreeStream(adaptor,"rule automatic_key");
        RewriteRuleSubtreeStream stream_upsert_key=new RewriteRuleSubtreeStream(adaptor,"rule upsert_key");
        try {
            // PLSQL_DMLParser.g:485:5: ( rules_key ( update_key | upsert_key ( all_key )? )? ( ( automatic_key | sequential_key ) order_key )? ( model_iterate_clause )? -> ^( rules_key ( update_key )? ( upsert_key )? ( all_key )? ( automatic_key )? ( sequential_key )? ( model_iterate_clause )? ) )
            // PLSQL_DMLParser.g:485:10: rules_key ( update_key | upsert_key ( all_key )? )? ( ( automatic_key | sequential_key ) order_key )? ( model_iterate_clause )?
            {
            pushFollow(FOLLOW_rules_key_in_model_rules_part3960);
            rules_key263=gPLSQLParser.rules_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_rules_key.add(rules_key263.getTree());

            // PLSQL_DMLParser.g:485:20: ( update_key | upsert_key ( all_key )? )?
            int alt86=3;
            int LA86_0 = input.LA(1);

            if ( (LA86_0==SQL92_RESERVED_UPDATE) ) {
                alt86=1;
            }
            else if ( (LA86_0==REGULAR_ID) && (((input.LT(1).getText().equalsIgnoreCase("automatic"))||(input.LT(1).getText().equalsIgnoreCase("iterate"))||(input.LT(1).getText().equalsIgnoreCase("upsert"))||(input.LT(1).getText().equalsIgnoreCase("sequential"))))) {
                int LA86_2 = input.LA(2);

                if ( ((input.LT(1).getText().equalsIgnoreCase("upsert"))) ) {
                    alt86=2;
                }
            }
            switch (alt86) {
                case 1 :
                    // PLSQL_DMLParser.g:485:21: update_key
                    {
                    pushFollow(FOLLOW_update_key_in_model_rules_part3963);
                    update_key264=gPLSQLParser.update_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_update_key.add(update_key264.getTree());

                    }
                    break;
                case 2 :
                    // PLSQL_DMLParser.g:485:32: upsert_key ( all_key )?
                    {
                    pushFollow(FOLLOW_upsert_key_in_model_rules_part3965);
                    upsert_key265=gPLSQLParser.upsert_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_upsert_key.add(upsert_key265.getTree());

                    // PLSQL_DMLParser.g:485:43: ( all_key )?
                    int alt85=2;
                    int LA85_0 = input.LA(1);

                    if ( (LA85_0==SQL92_RESERVED_ALL) ) {
                        alt85=1;
                    }
                    switch (alt85) {
                        case 1 :
                            // PLSQL_DMLParser.g:485:43: all_key
                            {
                            pushFollow(FOLLOW_all_key_in_model_rules_part3967);
                            all_key266=gPLSQLParser.all_key();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) stream_all_key.add(all_key266.getTree());

                            }
                            break;

                    }


                    }
                    break;

            }


            // PLSQL_DMLParser.g:485:54: ( ( automatic_key | sequential_key ) order_key )?
            int alt88=2;
            int LA88_0 = input.LA(1);

            if ( (LA88_0==REGULAR_ID) && (((input.LT(1).getText().equalsIgnoreCase("automatic"))||(input.LT(1).getText().equalsIgnoreCase("iterate"))||(input.LT(1).getText().equalsIgnoreCase("sequential"))))) {
                int LA88_1 = input.LA(2);

                if ( (LA88_1==SQL92_RESERVED_ORDER) && (((input.LT(1).getText().equalsIgnoreCase("automatic"))||(input.LT(1).getText().equalsIgnoreCase("sequential"))))) {
                    alt88=1;
                }
            }
            switch (alt88) {
                case 1 :
                    // PLSQL_DMLParser.g:485:55: ( automatic_key | sequential_key ) order_key
                    {
                    // PLSQL_DMLParser.g:485:55: ( automatic_key | sequential_key )
                    int alt87=2;
                    int LA87_0 = input.LA(1);

                    if ( (LA87_0==REGULAR_ID) && (((input.LT(1).getText().equalsIgnoreCase("automatic"))||(input.LT(1).getText().equalsIgnoreCase("sequential"))))) {
                        int LA87_1 = input.LA(2);

                        if ( ((input.LT(1).getText().equalsIgnoreCase("automatic"))) ) {
                            alt87=1;
                        }
                        else if ( ((input.LT(1).getText().equalsIgnoreCase("sequential"))) ) {
                            alt87=2;
                        }
                        else {
                            if (state.backtracking>0) {state.failed=true; return retval;}
                            NoViableAltException nvae =
                                new NoViableAltException("", 87, 1, input);

                            throw nvae;

                        }
                    }
                    else {
                        if (state.backtracking>0) {state.failed=true; return retval;}
                        NoViableAltException nvae =
                            new NoViableAltException("", 87, 0, input);

                        throw nvae;

                    }
                    switch (alt87) {
                        case 1 :
                            // PLSQL_DMLParser.g:485:56: automatic_key
                            {
                            pushFollow(FOLLOW_automatic_key_in_model_rules_part3974);
                            automatic_key267=gPLSQLParser.automatic_key();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) stream_automatic_key.add(automatic_key267.getTree());

                            }
                            break;
                        case 2 :
                            // PLSQL_DMLParser.g:485:70: sequential_key
                            {
                            pushFollow(FOLLOW_sequential_key_in_model_rules_part3976);
                            sequential_key268=gPLSQLParser.sequential_key();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) stream_sequential_key.add(sequential_key268.getTree());

                            }
                            break;

                    }


                    pushFollow(FOLLOW_order_key_in_model_rules_part3979);
                    order_key269=gPLSQLParser.order_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_order_key.add(order_key269.getTree());

                    }
                    break;

            }


            // PLSQL_DMLParser.g:485:98: ( model_iterate_clause )?
            int alt89=2;
            int LA89_0 = input.LA(1);

            if ( (LA89_0==REGULAR_ID) && ((input.LT(1).getText().equalsIgnoreCase("iterate")))) {
                alt89=1;
            }
            switch (alt89) {
                case 1 :
                    // PLSQL_DMLParser.g:485:98: model_iterate_clause
                    {
                    pushFollow(FOLLOW_model_iterate_clause_in_model_rules_part3983);
                    model_iterate_clause270=model_iterate_clause();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_model_iterate_clause.add(model_iterate_clause270.getTree());

                    }
                    break;

            }


            // AST REWRITE
            // elements: upsert_key, model_iterate_clause, automatic_key, rules_key, all_key, update_key, sequential_key
            // token labels: 
            // rule labels: retval
            // token list labels: 
            // rule list labels: 
            // wildcard labels: 
            if ( state.backtracking==0 ) {

            retval.tree = root_0;
            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

            root_0 = (Object)adaptor.nil();
            // 486:9: -> ^( rules_key ( update_key )? ( upsert_key )? ( all_key )? ( automatic_key )? ( sequential_key )? ( model_iterate_clause )? )
            {
                // PLSQL_DMLParser.g:486:12: ^( rules_key ( update_key )? ( upsert_key )? ( all_key )? ( automatic_key )? ( sequential_key )? ( model_iterate_clause )? )
                {
                Object root_1 = (Object)adaptor.nil();
                root_1 = (Object)adaptor.becomeRoot(stream_rules_key.nextNode(), root_1);

                // PLSQL_DMLParser.g:486:24: ( update_key )?
                if ( stream_update_key.hasNext() ) {
                    adaptor.addChild(root_1, stream_update_key.nextTree());

                }
                stream_update_key.reset();

                // PLSQL_DMLParser.g:486:36: ( upsert_key )?
                if ( stream_upsert_key.hasNext() ) {
                    adaptor.addChild(root_1, stream_upsert_key.nextTree());

                }
                stream_upsert_key.reset();

                // PLSQL_DMLParser.g:486:48: ( all_key )?
                if ( stream_all_key.hasNext() ) {
                    adaptor.addChild(root_1, stream_all_key.nextTree());

                }
                stream_all_key.reset();

                // PLSQL_DMLParser.g:486:57: ( automatic_key )?
                if ( stream_automatic_key.hasNext() ) {
                    adaptor.addChild(root_1, stream_automatic_key.nextTree());

                }
                stream_automatic_key.reset();

                // PLSQL_DMLParser.g:486:72: ( sequential_key )?
                if ( stream_sequential_key.hasNext() ) {
                    adaptor.addChild(root_1, stream_sequential_key.nextTree());

                }
                stream_sequential_key.reset();

                // PLSQL_DMLParser.g:486:88: ( model_iterate_clause )?
                if ( stream_model_iterate_clause.hasNext() ) {
                    adaptor.addChild(root_1, stream_model_iterate_clause.nextTree());

                }
                stream_model_iterate_clause.reset();

                adaptor.addChild(root_0, root_1);
                }

            }


            retval.tree = root_0;
            }

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "model_rules_part"


    public static class model_rules_element_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "model_rules_element"
    // PLSQL_DMLParser.g:489:1: model_rules_element : ( update_key | upsert_key ( ( all_key )=> all_key )? )? cell_assignment ( order_by_clause )? EQUALS_OP expression -> ^( MODEL_RULE ^( ASSIGN[$EQUALS_OP] cell_assignment ^( EXPR expression ) ) ( update_key )? ( upsert_key )? ( all_key )? ( order_by_clause )? ) ;
    public final PLSQLParser_PLSQL_DMLParser.model_rules_element_return model_rules_element() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.model_rules_element_return retval = new PLSQLParser_PLSQL_DMLParser.model_rules_element_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token EQUALS_OP276=null;
        PLSQLParser_PLSQLKeys.update_key_return update_key271 =null;

        PLSQLParser_PLSQLKeys.upsert_key_return upsert_key272 =null;

        PLSQLParser_PLSQLKeys.all_key_return all_key273 =null;

        PLSQLParser_PLSQL_DMLParser.cell_assignment_return cell_assignment274 =null;

        PLSQLParser_PLSQL_DMLParser.order_by_clause_return order_by_clause275 =null;

        PLSQLParser_PLSQL_DMLParser.expression_return expression277 =null;


        Object EQUALS_OP276_tree=null;
        RewriteRuleTokenStream stream_EQUALS_OP=new RewriteRuleTokenStream(adaptor,"token EQUALS_OP");
        RewriteRuleSubtreeStream stream_all_key=new RewriteRuleSubtreeStream(adaptor,"rule all_key");
        RewriteRuleSubtreeStream stream_expression=new RewriteRuleSubtreeStream(adaptor,"rule expression");
        RewriteRuleSubtreeStream stream_order_by_clause=new RewriteRuleSubtreeStream(adaptor,"rule order_by_clause");
        RewriteRuleSubtreeStream stream_update_key=new RewriteRuleSubtreeStream(adaptor,"rule update_key");
        RewriteRuleSubtreeStream stream_cell_assignment=new RewriteRuleSubtreeStream(adaptor,"rule cell_assignment");
        RewriteRuleSubtreeStream stream_upsert_key=new RewriteRuleSubtreeStream(adaptor,"rule upsert_key");
        try {
            // PLSQL_DMLParser.g:490:5: ( ( update_key | upsert_key ( ( all_key )=> all_key )? )? cell_assignment ( order_by_clause )? EQUALS_OP expression -> ^( MODEL_RULE ^( ASSIGN[$EQUALS_OP] cell_assignment ^( EXPR expression ) ) ( update_key )? ( upsert_key )? ( all_key )? ( order_by_clause )? ) )
            // PLSQL_DMLParser.g:490:10: ( update_key | upsert_key ( ( all_key )=> all_key )? )? cell_assignment ( order_by_clause )? EQUALS_OP expression
            {
            // PLSQL_DMLParser.g:490:10: ( update_key | upsert_key ( ( all_key )=> all_key )? )?
            int alt91=3;
            int LA91_0 = input.LA(1);

            if ( (LA91_0==SQL92_RESERVED_UPDATE) ) {
                alt91=1;
            }
            else if ( (LA91_0==REGULAR_ID) ) {
                int LA91_2 = input.LA(2);

                if ( ((input.LT(1).getText().equalsIgnoreCase("upsert"))) ) {
                    alt91=2;
                }
            }
            switch (alt91) {
                case 1 :
                    // PLSQL_DMLParser.g:490:11: update_key
                    {
                    pushFollow(FOLLOW_update_key_in_model_rules_element4037);
                    update_key271=gPLSQLParser.update_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_update_key.add(update_key271.getTree());

                    }
                    break;
                case 2 :
                    // PLSQL_DMLParser.g:490:22: upsert_key ( ( all_key )=> all_key )?
                    {
                    pushFollow(FOLLOW_upsert_key_in_model_rules_element4039);
                    upsert_key272=gPLSQLParser.upsert_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_upsert_key.add(upsert_key272.getTree());

                    // PLSQL_DMLParser.g:490:33: ( ( all_key )=> all_key )?
                    int alt90=2;
                    int LA90_0 = input.LA(1);

                    if ( (LA90_0==SQL92_RESERVED_ALL) ) {
                        int LA90_1 = input.LA(2);

                        if ( (synpred12_PLSQL_DMLParser()) ) {
                            alt90=1;
                        }
                    }
                    switch (alt90) {
                        case 1 :
                            // PLSQL_DMLParser.g:490:34: ( all_key )=> all_key
                            {
                            pushFollow(FOLLOW_all_key_in_model_rules_element4047);
                            all_key273=gPLSQLParser.all_key();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) stream_all_key.add(all_key273.getTree());

                            }
                            break;

                    }


                    }
                    break;

            }


            pushFollow(FOLLOW_cell_assignment_in_model_rules_element4061);
            cell_assignment274=cell_assignment();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_cell_assignment.add(cell_assignment274.getTree());

            // PLSQL_DMLParser.g:492:17: ( order_by_clause )?
            int alt92=2;
            int LA92_0 = input.LA(1);

            if ( (LA92_0==SQL92_RESERVED_ORDER) ) {
                alt92=1;
            }
            switch (alt92) {
                case 1 :
                    // PLSQL_DMLParser.g:492:17: order_by_clause
                    {
                    pushFollow(FOLLOW_order_by_clause_in_model_rules_element4079);
                    order_by_clause275=order_by_clause();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_order_by_clause.add(order_by_clause275.getTree());

                    }
                    break;

            }


            EQUALS_OP276=(Token)match(input,EQUALS_OP,FOLLOW_EQUALS_OP_in_model_rules_element4094); if (state.failed) return retval; 
            if ( state.backtracking==0 ) stream_EQUALS_OP.add(EQUALS_OP276);


            pushFollow(FOLLOW_expression_in_model_rules_element4096);
            expression277=expression();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_expression.add(expression277.getTree());

            // AST REWRITE
            // elements: cell_assignment, expression, update_key, order_by_clause, all_key, upsert_key
            // token labels: 
            // rule labels: retval
            // token list labels: 
            // rule list labels: 
            // wildcard labels: 
            if ( state.backtracking==0 ) {

            retval.tree = root_0;
            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

            root_0 = (Object)adaptor.nil();
            // 494:9: -> ^( MODEL_RULE ^( ASSIGN[$EQUALS_OP] cell_assignment ^( EXPR expression ) ) ( update_key )? ( upsert_key )? ( all_key )? ( order_by_clause )? )
            {
                // PLSQL_DMLParser.g:494:12: ^( MODEL_RULE ^( ASSIGN[$EQUALS_OP] cell_assignment ^( EXPR expression ) ) ( update_key )? ( upsert_key )? ( all_key )? ( order_by_clause )? )
                {
                Object root_1 = (Object)adaptor.nil();
                root_1 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(MODEL_RULE, "MODEL_RULE")
                , root_1);

                // PLSQL_DMLParser.g:494:25: ^( ASSIGN[$EQUALS_OP] cell_assignment ^( EXPR expression ) )
                {
                Object root_2 = (Object)adaptor.nil();
                root_2 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(ASSIGN, EQUALS_OP276)
                , root_2);

                adaptor.addChild(root_2, stream_cell_assignment.nextTree());

                // PLSQL_DMLParser.g:494:62: ^( EXPR expression )
                {
                Object root_3 = (Object)adaptor.nil();
                root_3 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(EXPR, "EXPR")
                , root_3);

                adaptor.addChild(root_3, stream_expression.nextTree());

                adaptor.addChild(root_2, root_3);
                }

                adaptor.addChild(root_1, root_2);
                }

                // PLSQL_DMLParser.g:494:82: ( update_key )?
                if ( stream_update_key.hasNext() ) {
                    adaptor.addChild(root_1, stream_update_key.nextTree());

                }
                stream_update_key.reset();

                // PLSQL_DMLParser.g:494:94: ( upsert_key )?
                if ( stream_upsert_key.hasNext() ) {
                    adaptor.addChild(root_1, stream_upsert_key.nextTree());

                }
                stream_upsert_key.reset();

                // PLSQL_DMLParser.g:494:106: ( all_key )?
                if ( stream_all_key.hasNext() ) {
                    adaptor.addChild(root_1, stream_all_key.nextTree());

                }
                stream_all_key.reset();

                // PLSQL_DMLParser.g:494:115: ( order_by_clause )?
                if ( stream_order_by_clause.hasNext() ) {
                    adaptor.addChild(root_1, stream_order_by_clause.nextTree());

                }
                stream_order_by_clause.reset();

                adaptor.addChild(root_0, root_1);
                }

            }


            retval.tree = root_0;
            }

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "model_rules_element"


    public static class cell_assignment_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "cell_assignment"
    // PLSQL_DMLParser.g:497:1: cell_assignment : model_expression ;
    public final PLSQLParser_PLSQL_DMLParser.cell_assignment_return cell_assignment() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.cell_assignment_return retval = new PLSQLParser_PLSQL_DMLParser.cell_assignment_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        PLSQLParser_PLSQL_DMLParser.model_expression_return model_expression278 =null;



        try {
            // PLSQL_DMLParser.g:498:5: ( model_expression )
            // PLSQL_DMLParser.g:498:10: model_expression
            {
            root_0 = (Object)adaptor.nil();


            pushFollow(FOLLOW_model_expression_in_cell_assignment4155);
            model_expression278=model_expression();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) adaptor.addChild(root_0, model_expression278.getTree());

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "cell_assignment"


    public static class model_iterate_clause_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "model_iterate_clause"
    // PLSQL_DMLParser.g:501:1: model_iterate_clause : iterate_key LEFT_PAREN expression RIGHT_PAREN ( until_part )? -> ^( iterate_key ^( EXPR expression ) ( until_part )? ) ;
    public final PLSQLParser_PLSQL_DMLParser.model_iterate_clause_return model_iterate_clause() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.model_iterate_clause_return retval = new PLSQLParser_PLSQL_DMLParser.model_iterate_clause_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token LEFT_PAREN280=null;
        Token RIGHT_PAREN282=null;
        PLSQLParser_PLSQLKeys.iterate_key_return iterate_key279 =null;

        PLSQLParser_PLSQL_DMLParser.expression_return expression281 =null;

        PLSQLParser_PLSQL_DMLParser.until_part_return until_part283 =null;


        Object LEFT_PAREN280_tree=null;
        Object RIGHT_PAREN282_tree=null;
        RewriteRuleTokenStream stream_LEFT_PAREN=new RewriteRuleTokenStream(adaptor,"token LEFT_PAREN");
        RewriteRuleTokenStream stream_RIGHT_PAREN=new RewriteRuleTokenStream(adaptor,"token RIGHT_PAREN");
        RewriteRuleSubtreeStream stream_iterate_key=new RewriteRuleSubtreeStream(adaptor,"rule iterate_key");
        RewriteRuleSubtreeStream stream_expression=new RewriteRuleSubtreeStream(adaptor,"rule expression");
        RewriteRuleSubtreeStream stream_until_part=new RewriteRuleSubtreeStream(adaptor,"rule until_part");
        try {
            // PLSQL_DMLParser.g:502:5: ( iterate_key LEFT_PAREN expression RIGHT_PAREN ( until_part )? -> ^( iterate_key ^( EXPR expression ) ( until_part )? ) )
            // PLSQL_DMLParser.g:502:10: iterate_key LEFT_PAREN expression RIGHT_PAREN ( until_part )?
            {
            pushFollow(FOLLOW_iterate_key_in_model_iterate_clause4175);
            iterate_key279=gPLSQLParser.iterate_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_iterate_key.add(iterate_key279.getTree());

            LEFT_PAREN280=(Token)match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_model_iterate_clause4177); if (state.failed) return retval; 
            if ( state.backtracking==0 ) stream_LEFT_PAREN.add(LEFT_PAREN280);


            pushFollow(FOLLOW_expression_in_model_iterate_clause4179);
            expression281=expression();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_expression.add(expression281.getTree());

            RIGHT_PAREN282=(Token)match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_model_iterate_clause4181); if (state.failed) return retval; 
            if ( state.backtracking==0 ) stream_RIGHT_PAREN.add(RIGHT_PAREN282);


            // PLSQL_DMLParser.g:502:56: ( until_part )?
            int alt93=2;
            int LA93_0 = input.LA(1);

            if ( (LA93_0==REGULAR_ID) && ((input.LT(1).getText().equalsIgnoreCase("until")))) {
                alt93=1;
            }
            switch (alt93) {
                case 1 :
                    // PLSQL_DMLParser.g:502:56: until_part
                    {
                    pushFollow(FOLLOW_until_part_in_model_iterate_clause4183);
                    until_part283=until_part();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_until_part.add(until_part283.getTree());

                    }
                    break;

            }


            // AST REWRITE
            // elements: iterate_key, until_part, expression
            // token labels: 
            // rule labels: retval
            // token list labels: 
            // rule list labels: 
            // wildcard labels: 
            if ( state.backtracking==0 ) {

            retval.tree = root_0;
            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

            root_0 = (Object)adaptor.nil();
            // 503:9: -> ^( iterate_key ^( EXPR expression ) ( until_part )? )
            {
                // PLSQL_DMLParser.g:503:11: ^( iterate_key ^( EXPR expression ) ( until_part )? )
                {
                Object root_1 = (Object)adaptor.nil();
                root_1 = (Object)adaptor.becomeRoot(stream_iterate_key.nextNode(), root_1);

                // PLSQL_DMLParser.g:503:25: ^( EXPR expression )
                {
                Object root_2 = (Object)adaptor.nil();
                root_2 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(EXPR, "EXPR")
                , root_2);

                adaptor.addChild(root_2, stream_expression.nextTree());

                adaptor.addChild(root_1, root_2);
                }

                // PLSQL_DMLParser.g:503:44: ( until_part )?
                if ( stream_until_part.hasNext() ) {
                    adaptor.addChild(root_1, stream_until_part.nextTree());

                }
                stream_until_part.reset();

                adaptor.addChild(root_0, root_1);
                }

            }


            retval.tree = root_0;
            }

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "model_iterate_clause"


    public static class until_part_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "until_part"
    // PLSQL_DMLParser.g:506:1: until_part : until_key LEFT_PAREN condition RIGHT_PAREN -> ^( until_key ^( LOGIC_EXPR condition ) ) ;
    public final PLSQLParser_PLSQL_DMLParser.until_part_return until_part() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.until_part_return retval = new PLSQLParser_PLSQL_DMLParser.until_part_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token LEFT_PAREN285=null;
        Token RIGHT_PAREN287=null;
        PLSQLParser_PLSQLKeys.until_key_return until_key284 =null;

        PLSQLParser_PLSQL_DMLParser.condition_return condition286 =null;


        Object LEFT_PAREN285_tree=null;
        Object RIGHT_PAREN287_tree=null;
        RewriteRuleTokenStream stream_LEFT_PAREN=new RewriteRuleTokenStream(adaptor,"token LEFT_PAREN");
        RewriteRuleTokenStream stream_RIGHT_PAREN=new RewriteRuleTokenStream(adaptor,"token RIGHT_PAREN");
        RewriteRuleSubtreeStream stream_until_key=new RewriteRuleSubtreeStream(adaptor,"rule until_key");
        RewriteRuleSubtreeStream stream_condition=new RewriteRuleSubtreeStream(adaptor,"rule condition");
        try {
            // PLSQL_DMLParser.g:507:5: ( until_key LEFT_PAREN condition RIGHT_PAREN -> ^( until_key ^( LOGIC_EXPR condition ) ) )
            // PLSQL_DMLParser.g:507:10: until_key LEFT_PAREN condition RIGHT_PAREN
            {
            pushFollow(FOLLOW_until_key_in_until_part4226);
            until_key284=gPLSQLParser.until_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_until_key.add(until_key284.getTree());

            LEFT_PAREN285=(Token)match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_until_part4228); if (state.failed) return retval; 
            if ( state.backtracking==0 ) stream_LEFT_PAREN.add(LEFT_PAREN285);


            pushFollow(FOLLOW_condition_in_until_part4230);
            condition286=condition();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_condition.add(condition286.getTree());

            RIGHT_PAREN287=(Token)match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_until_part4232); if (state.failed) return retval; 
            if ( state.backtracking==0 ) stream_RIGHT_PAREN.add(RIGHT_PAREN287);


            // AST REWRITE
            // elements: condition, until_key
            // token labels: 
            // rule labels: retval
            // token list labels: 
            // rule list labels: 
            // wildcard labels: 
            if ( state.backtracking==0 ) {

            retval.tree = root_0;
            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

            root_0 = (Object)adaptor.nil();
            // 508:9: -> ^( until_key ^( LOGIC_EXPR condition ) )
            {
                // PLSQL_DMLParser.g:508:12: ^( until_key ^( LOGIC_EXPR condition ) )
                {
                Object root_1 = (Object)adaptor.nil();
                root_1 = (Object)adaptor.becomeRoot(stream_until_key.nextNode(), root_1);

                // PLSQL_DMLParser.g:508:24: ^( LOGIC_EXPR condition )
                {
                Object root_2 = (Object)adaptor.nil();
                root_2 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(LOGIC_EXPR, "LOGIC_EXPR")
                , root_2);

                adaptor.addChild(root_2, stream_condition.nextTree());

                adaptor.addChild(root_1, root_2);
                }

                adaptor.addChild(root_0, root_1);
                }

            }


            retval.tree = root_0;
            }

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "until_part"


    public static class order_by_clause_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "order_by_clause"
    // PLSQL_DMLParser.g:511:1: order_by_clause : order_key ( siblings_key )? by_key order_by_elements ( COMMA order_by_elements )* -> ^( order_key ( siblings_key )? ^( ORDER_BY_ELEMENTS ( order_by_elements )+ ) ) ;
    public final PLSQLParser_PLSQL_DMLParser.order_by_clause_return order_by_clause() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.order_by_clause_return retval = new PLSQLParser_PLSQL_DMLParser.order_by_clause_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token COMMA292=null;
        PLSQLParser_PLSQLKeys.order_key_return order_key288 =null;

        PLSQLParser_PLSQLKeys.siblings_key_return siblings_key289 =null;

        PLSQLParser_PLSQLKeys.by_key_return by_key290 =null;

        PLSQLParser_PLSQL_DMLParser.order_by_elements_return order_by_elements291 =null;

        PLSQLParser_PLSQL_DMLParser.order_by_elements_return order_by_elements293 =null;


        Object COMMA292_tree=null;
        RewriteRuleTokenStream stream_COMMA=new RewriteRuleTokenStream(adaptor,"token COMMA");
        RewriteRuleSubtreeStream stream_order_key=new RewriteRuleSubtreeStream(adaptor,"rule order_key");
        RewriteRuleSubtreeStream stream_by_key=new RewriteRuleSubtreeStream(adaptor,"rule by_key");
        RewriteRuleSubtreeStream stream_siblings_key=new RewriteRuleSubtreeStream(adaptor,"rule siblings_key");
        RewriteRuleSubtreeStream stream_order_by_elements=new RewriteRuleSubtreeStream(adaptor,"rule order_by_elements");
        try {
            // PLSQL_DMLParser.g:512:5: ( order_key ( siblings_key )? by_key order_by_elements ( COMMA order_by_elements )* -> ^( order_key ( siblings_key )? ^( ORDER_BY_ELEMENTS ( order_by_elements )+ ) ) )
            // PLSQL_DMLParser.g:512:10: order_key ( siblings_key )? by_key order_by_elements ( COMMA order_by_elements )*
            {
            pushFollow(FOLLOW_order_key_in_order_by_clause4272);
            order_key288=gPLSQLParser.order_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_order_key.add(order_key288.getTree());

            // PLSQL_DMLParser.g:512:20: ( siblings_key )?
            int alt94=2;
            int LA94_0 = input.LA(1);

            if ( (LA94_0==REGULAR_ID) && ((input.LT(1).getText().equalsIgnoreCase("siblings")))) {
                alt94=1;
            }
            switch (alt94) {
                case 1 :
                    // PLSQL_DMLParser.g:512:20: siblings_key
                    {
                    pushFollow(FOLLOW_siblings_key_in_order_by_clause4274);
                    siblings_key289=gPLSQLParser.siblings_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_siblings_key.add(siblings_key289.getTree());

                    }
                    break;

            }


            pushFollow(FOLLOW_by_key_in_order_by_clause4277);
            by_key290=gPLSQLParser.by_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_by_key.add(by_key290.getTree());

            pushFollow(FOLLOW_order_by_elements_in_order_by_clause4279);
            order_by_elements291=order_by_elements();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_order_by_elements.add(order_by_elements291.getTree());

            // PLSQL_DMLParser.g:512:59: ( COMMA order_by_elements )*
            loop95:
            do {
                int alt95=2;
                int LA95_0 = input.LA(1);

                if ( (LA95_0==COMMA) ) {
                    alt95=1;
                }


                switch (alt95) {
            	case 1 :
            	    // PLSQL_DMLParser.g:512:60: COMMA order_by_elements
            	    {
            	    COMMA292=(Token)match(input,COMMA,FOLLOW_COMMA_in_order_by_clause4282); if (state.failed) return retval; 
            	    if ( state.backtracking==0 ) stream_COMMA.add(COMMA292);


            	    pushFollow(FOLLOW_order_by_elements_in_order_by_clause4284);
            	    order_by_elements293=order_by_elements();

            	    state._fsp--;
            	    if (state.failed) return retval;
            	    if ( state.backtracking==0 ) stream_order_by_elements.add(order_by_elements293.getTree());

            	    }
            	    break;

            	default :
            	    break loop95;
                }
            } while (true);


            // AST REWRITE
            // elements: order_by_elements, order_key, siblings_key
            // token labels: 
            // rule labels: retval
            // token list labels: 
            // rule list labels: 
            // wildcard labels: 
            if ( state.backtracking==0 ) {

            retval.tree = root_0;
            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

            root_0 = (Object)adaptor.nil();
            // 513:9: -> ^( order_key ( siblings_key )? ^( ORDER_BY_ELEMENTS ( order_by_elements )+ ) )
            {
                // PLSQL_DMLParser.g:513:12: ^( order_key ( siblings_key )? ^( ORDER_BY_ELEMENTS ( order_by_elements )+ ) )
                {
                Object root_1 = (Object)adaptor.nil();
                root_1 = (Object)adaptor.becomeRoot(stream_order_key.nextNode(), root_1);

                // PLSQL_DMLParser.g:513:24: ( siblings_key )?
                if ( stream_siblings_key.hasNext() ) {
                    adaptor.addChild(root_1, stream_siblings_key.nextTree());

                }
                stream_siblings_key.reset();

                // PLSQL_DMLParser.g:513:38: ^( ORDER_BY_ELEMENTS ( order_by_elements )+ )
                {
                Object root_2 = (Object)adaptor.nil();
                root_2 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(ORDER_BY_ELEMENTS, "ORDER_BY_ELEMENTS")
                , root_2);

                if ( !(stream_order_by_elements.hasNext()) ) {
                    throw new RewriteEarlyExitException();
                }
                while ( stream_order_by_elements.hasNext() ) {
                    adaptor.addChild(root_2, stream_order_by_elements.nextTree());

                }
                stream_order_by_elements.reset();

                adaptor.addChild(root_1, root_2);
                }

                adaptor.addChild(root_0, root_1);
                }

            }


            retval.tree = root_0;
            }

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "order_by_clause"


    public static class order_by_elements_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "order_by_elements"
    // PLSQL_DMLParser.g:516:1: order_by_elements : expression ( asc_key | desc_key )? ( nulls_key ( first_key | last_key ) )? -> ^( ORDER_BY_ELEMENT ^( EXPR expression ) ( asc_key )? ( desc_key )? ( nulls_key )? ( first_key )? ( last_key )? ) ;
    public final PLSQLParser_PLSQL_DMLParser.order_by_elements_return order_by_elements() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.order_by_elements_return retval = new PLSQLParser_PLSQL_DMLParser.order_by_elements_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        PLSQLParser_PLSQL_DMLParser.expression_return expression294 =null;

        PLSQLParser_PLSQLKeys.asc_key_return asc_key295 =null;

        PLSQLParser_PLSQLKeys.desc_key_return desc_key296 =null;

        PLSQLParser_PLSQLKeys.nulls_key_return nulls_key297 =null;

        PLSQLParser_PLSQLKeys.first_key_return first_key298 =null;

        PLSQLParser_PLSQLKeys.last_key_return last_key299 =null;


        RewriteRuleSubtreeStream stream_expression=new RewriteRuleSubtreeStream(adaptor,"rule expression");
        RewriteRuleSubtreeStream stream_desc_key=new RewriteRuleSubtreeStream(adaptor,"rule desc_key");
        RewriteRuleSubtreeStream stream_nulls_key=new RewriteRuleSubtreeStream(adaptor,"rule nulls_key");
        RewriteRuleSubtreeStream stream_last_key=new RewriteRuleSubtreeStream(adaptor,"rule last_key");
        RewriteRuleSubtreeStream stream_asc_key=new RewriteRuleSubtreeStream(adaptor,"rule asc_key");
        RewriteRuleSubtreeStream stream_first_key=new RewriteRuleSubtreeStream(adaptor,"rule first_key");
        try {
            // PLSQL_DMLParser.g:517:5: ( expression ( asc_key | desc_key )? ( nulls_key ( first_key | last_key ) )? -> ^( ORDER_BY_ELEMENT ^( EXPR expression ) ( asc_key )? ( desc_key )? ( nulls_key )? ( first_key )? ( last_key )? ) )
            // PLSQL_DMLParser.g:517:10: expression ( asc_key | desc_key )? ( nulls_key ( first_key | last_key ) )?
            {
            pushFollow(FOLLOW_expression_in_order_by_elements4330);
            expression294=expression();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_expression.add(expression294.getTree());

            // PLSQL_DMLParser.g:517:21: ( asc_key | desc_key )?
            int alt96=3;
            int LA96_0 = input.LA(1);

            if ( (LA96_0==SQL92_RESERVED_ASC) ) {
                alt96=1;
            }
            else if ( (LA96_0==SQL92_RESERVED_DESC) ) {
                alt96=2;
            }
            switch (alt96) {
                case 1 :
                    // PLSQL_DMLParser.g:517:22: asc_key
                    {
                    pushFollow(FOLLOW_asc_key_in_order_by_elements4333);
                    asc_key295=gPLSQLParser.asc_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_asc_key.add(asc_key295.getTree());

                    }
                    break;
                case 2 :
                    // PLSQL_DMLParser.g:517:30: desc_key
                    {
                    pushFollow(FOLLOW_desc_key_in_order_by_elements4335);
                    desc_key296=gPLSQLParser.desc_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_desc_key.add(desc_key296.getTree());

                    }
                    break;

            }


            // PLSQL_DMLParser.g:517:41: ( nulls_key ( first_key | last_key ) )?
            int alt98=2;
            int LA98_0 = input.LA(1);

            if ( (LA98_0==REGULAR_ID) ) {
                int LA98_1 = input.LA(2);

                if ( (LA98_1==REGULAR_ID) && (((input.LT(1).getText().equalsIgnoreCase("log"))||(input.LT(1).getText().equalsIgnoreCase("nulls"))||(input.LT(1).getText().equalsIgnoreCase("rows"))||(input.LT(1).getText().equalsIgnoreCase("range"))))) {
                    int LA98_3 = input.LA(3);

                    if ( ((input.LT(1).getText().equalsIgnoreCase("nulls"))) ) {
                        alt98=1;
                    }
                }
            }
            switch (alt98) {
                case 1 :
                    // PLSQL_DMLParser.g:517:42: nulls_key ( first_key | last_key )
                    {
                    pushFollow(FOLLOW_nulls_key_in_order_by_elements4340);
                    nulls_key297=gPLSQLParser.nulls_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_nulls_key.add(nulls_key297.getTree());

                    // PLSQL_DMLParser.g:517:52: ( first_key | last_key )
                    int alt97=2;
                    int LA97_0 = input.LA(1);

                    if ( (LA97_0==REGULAR_ID) && (((input.LT(1).getText().equalsIgnoreCase("first"))||(input.LT(1).getText().equalsIgnoreCase("last"))))) {
                        int LA97_1 = input.LA(2);

                        if ( ((input.LT(1).getText().equalsIgnoreCase("first"))) ) {
                            alt97=1;
                        }
                        else if ( ((input.LT(1).getText().equalsIgnoreCase("last"))) ) {
                            alt97=2;
                        }
                        else {
                            if (state.backtracking>0) {state.failed=true; return retval;}
                            NoViableAltException nvae =
                                new NoViableAltException("", 97, 1, input);

                            throw nvae;

                        }
                    }
                    else {
                        if (state.backtracking>0) {state.failed=true; return retval;}
                        NoViableAltException nvae =
                            new NoViableAltException("", 97, 0, input);

                        throw nvae;

                    }
                    switch (alt97) {
                        case 1 :
                            // PLSQL_DMLParser.g:517:53: first_key
                            {
                            pushFollow(FOLLOW_first_key_in_order_by_elements4343);
                            first_key298=gPLSQLParser.first_key();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) stream_first_key.add(first_key298.getTree());

                            }
                            break;
                        case 2 :
                            // PLSQL_DMLParser.g:517:63: last_key
                            {
                            pushFollow(FOLLOW_last_key_in_order_by_elements4345);
                            last_key299=gPLSQLParser.last_key();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) stream_last_key.add(last_key299.getTree());

                            }
                            break;

                    }


                    }
                    break;

            }


            // AST REWRITE
            // elements: desc_key, asc_key, nulls_key, last_key, first_key, expression
            // token labels: 
            // rule labels: retval
            // token list labels: 
            // rule list labels: 
            // wildcard labels: 
            if ( state.backtracking==0 ) {

            retval.tree = root_0;
            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

            root_0 = (Object)adaptor.nil();
            // 518:9: -> ^( ORDER_BY_ELEMENT ^( EXPR expression ) ( asc_key )? ( desc_key )? ( nulls_key )? ( first_key )? ( last_key )? )
            {
                // PLSQL_DMLParser.g:518:12: ^( ORDER_BY_ELEMENT ^( EXPR expression ) ( asc_key )? ( desc_key )? ( nulls_key )? ( first_key )? ( last_key )? )
                {
                Object root_1 = (Object)adaptor.nil();
                root_1 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(ORDER_BY_ELEMENT, "ORDER_BY_ELEMENT")
                , root_1);

                // PLSQL_DMLParser.g:518:31: ^( EXPR expression )
                {
                Object root_2 = (Object)adaptor.nil();
                root_2 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(EXPR, "EXPR")
                , root_2);

                adaptor.addChild(root_2, stream_expression.nextTree());

                adaptor.addChild(root_1, root_2);
                }

                // PLSQL_DMLParser.g:518:50: ( asc_key )?
                if ( stream_asc_key.hasNext() ) {
                    adaptor.addChild(root_1, stream_asc_key.nextTree());

                }
                stream_asc_key.reset();

                // PLSQL_DMLParser.g:518:59: ( desc_key )?
                if ( stream_desc_key.hasNext() ) {
                    adaptor.addChild(root_1, stream_desc_key.nextTree());

                }
                stream_desc_key.reset();

                // PLSQL_DMLParser.g:518:69: ( nulls_key )?
                if ( stream_nulls_key.hasNext() ) {
                    adaptor.addChild(root_1, stream_nulls_key.nextTree());

                }
                stream_nulls_key.reset();

                // PLSQL_DMLParser.g:518:80: ( first_key )?
                if ( stream_first_key.hasNext() ) {
                    adaptor.addChild(root_1, stream_first_key.nextTree());

                }
                stream_first_key.reset();

                // PLSQL_DMLParser.g:518:91: ( last_key )?
                if ( stream_last_key.hasNext() ) {
                    adaptor.addChild(root_1, stream_last_key.nextTree());

                }
                stream_last_key.reset();

                adaptor.addChild(root_0, root_1);
                }

            }


            retval.tree = root_0;
            }

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "order_by_elements"


    public static class for_update_clause_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "for_update_clause"
    // PLSQL_DMLParser.g:521:1: for_update_clause : for_key update_key ( for_update_of_part )? ( for_update_options )? -> ^( for_key ( for_update_of_part )? ( for_update_options )? ) ;
    public final PLSQLParser_PLSQL_DMLParser.for_update_clause_return for_update_clause() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.for_update_clause_return retval = new PLSQLParser_PLSQL_DMLParser.for_update_clause_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        PLSQLParser_PLSQLKeys.for_key_return for_key300 =null;

        PLSQLParser_PLSQLKeys.update_key_return update_key301 =null;

        PLSQLParser_PLSQL_DMLParser.for_update_of_part_return for_update_of_part302 =null;

        PLSQLParser_PLSQL_DMLParser.for_update_options_return for_update_options303 =null;


        RewriteRuleSubtreeStream stream_for_update_of_part=new RewriteRuleSubtreeStream(adaptor,"rule for_update_of_part");
        RewriteRuleSubtreeStream stream_for_update_options=new RewriteRuleSubtreeStream(adaptor,"rule for_update_options");
        RewriteRuleSubtreeStream stream_update_key=new RewriteRuleSubtreeStream(adaptor,"rule update_key");
        RewriteRuleSubtreeStream stream_for_key=new RewriteRuleSubtreeStream(adaptor,"rule for_key");
        try {
            // PLSQL_DMLParser.g:522:5: ( for_key update_key ( for_update_of_part )? ( for_update_options )? -> ^( for_key ( for_update_of_part )? ( for_update_options )? ) )
            // PLSQL_DMLParser.g:522:10: for_key update_key ( for_update_of_part )? ( for_update_options )?
            {
            pushFollow(FOLLOW_for_key_in_for_update_clause4403);
            for_key300=gPLSQLParser.for_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_for_key.add(for_key300.getTree());

            pushFollow(FOLLOW_update_key_in_for_update_clause4405);
            update_key301=gPLSQLParser.update_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_update_key.add(update_key301.getTree());

            // PLSQL_DMLParser.g:522:29: ( for_update_of_part )?
            int alt99=2;
            int LA99_0 = input.LA(1);

            if ( (LA99_0==SQL92_RESERVED_OF) ) {
                alt99=1;
            }
            switch (alt99) {
                case 1 :
                    // PLSQL_DMLParser.g:522:29: for_update_of_part
                    {
                    pushFollow(FOLLOW_for_update_of_part_in_for_update_clause4407);
                    for_update_of_part302=for_update_of_part();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_for_update_of_part.add(for_update_of_part302.getTree());

                    }
                    break;

            }


            // PLSQL_DMLParser.g:522:49: ( for_update_options )?
            int alt100=2;
            int LA100_0 = input.LA(1);

            if ( (LA100_0==REGULAR_ID) ) {
                int LA100_1 = input.LA(2);

                if ( (((input.LT(1).getText().equalsIgnoreCase("skip"))||(input.LT(1).getText().equalsIgnoreCase("wait")))) ) {
                    alt100=1;
                }
            }
            else if ( (LA100_0==PLSQL_RESERVED_NOWAIT) ) {
                alt100=1;
            }
            switch (alt100) {
                case 1 :
                    // PLSQL_DMLParser.g:522:49: for_update_options
                    {
                    pushFollow(FOLLOW_for_update_options_in_for_update_clause4410);
                    for_update_options303=for_update_options();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_for_update_options.add(for_update_options303.getTree());

                    }
                    break;

            }


            // AST REWRITE
            // elements: for_update_of_part, for_update_options, for_key
            // token labels: 
            // rule labels: retval
            // token list labels: 
            // rule list labels: 
            // wildcard labels: 
            if ( state.backtracking==0 ) {

            retval.tree = root_0;
            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

            root_0 = (Object)adaptor.nil();
            // 523:9: -> ^( for_key ( for_update_of_part )? ( for_update_options )? )
            {
                // PLSQL_DMLParser.g:523:12: ^( for_key ( for_update_of_part )? ( for_update_options )? )
                {
                Object root_1 = (Object)adaptor.nil();
                root_1 = (Object)adaptor.becomeRoot(stream_for_key.nextNode(), root_1);

                // PLSQL_DMLParser.g:523:22: ( for_update_of_part )?
                if ( stream_for_update_of_part.hasNext() ) {
                    adaptor.addChild(root_1, stream_for_update_of_part.nextTree());

                }
                stream_for_update_of_part.reset();

                // PLSQL_DMLParser.g:523:42: ( for_update_options )?
                if ( stream_for_update_options.hasNext() ) {
                    adaptor.addChild(root_1, stream_for_update_options.nextTree());

                }
                stream_for_update_options.reset();

                adaptor.addChild(root_0, root_1);
                }

            }


            retval.tree = root_0;
            }

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "for_update_clause"


    public static class for_update_of_part_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "for_update_of_part"
    // PLSQL_DMLParser.g:526:1: for_update_of_part : of_key ^ column_name ( COMMA ! column_name )* ;
    public final PLSQLParser_PLSQL_DMLParser.for_update_of_part_return for_update_of_part() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.for_update_of_part_return retval = new PLSQLParser_PLSQL_DMLParser.for_update_of_part_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token COMMA306=null;
        PLSQLParser_PLSQLKeys.of_key_return of_key304 =null;

        PLSQLParser_PLSQLCommons.column_name_return column_name305 =null;

        PLSQLParser_PLSQLCommons.column_name_return column_name307 =null;


        Object COMMA306_tree=null;

        try {
            // PLSQL_DMLParser.g:527:5: ( of_key ^ column_name ( COMMA ! column_name )* )
            // PLSQL_DMLParser.g:527:10: of_key ^ column_name ( COMMA ! column_name )*
            {
            root_0 = (Object)adaptor.nil();


            pushFollow(FOLLOW_of_key_in_for_update_of_part4451);
            of_key304=gPLSQLParser.of_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) root_0 = (Object)adaptor.becomeRoot(of_key304.getTree(), root_0);

            pushFollow(FOLLOW_column_name_in_for_update_of_part4454);
            column_name305=gPLSQLParser.column_name();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) adaptor.addChild(root_0, column_name305.getTree());

            // PLSQL_DMLParser.g:527:30: ( COMMA ! column_name )*
            loop101:
            do {
                int alt101=2;
                int LA101_0 = input.LA(1);

                if ( (LA101_0==COMMA) ) {
                    alt101=1;
                }


                switch (alt101) {
            	case 1 :
            	    // PLSQL_DMLParser.g:527:31: COMMA ! column_name
            	    {
            	    COMMA306=(Token)match(input,COMMA,FOLLOW_COMMA_in_for_update_of_part4457); if (state.failed) return retval;

            	    pushFollow(FOLLOW_column_name_in_for_update_of_part4460);
            	    column_name307=gPLSQLParser.column_name();

            	    state._fsp--;
            	    if (state.failed) return retval;
            	    if ( state.backtracking==0 ) adaptor.addChild(root_0, column_name307.getTree());

            	    }
            	    break;

            	default :
            	    break loop101;
                }
            } while (true);


            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "for_update_of_part"


    public static class for_update_options_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "for_update_options"
    // PLSQL_DMLParser.g:530:1: for_update_options : ( skip_key locked_key !| nowait_key | wait_key expression -> ^( wait_key ^( EXPR expression ) ) );
    public final PLSQLParser_PLSQL_DMLParser.for_update_options_return for_update_options() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.for_update_options_return retval = new PLSQLParser_PLSQL_DMLParser.for_update_options_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        PLSQLParser_PLSQLKeys.skip_key_return skip_key308 =null;

        PLSQLParser_PLSQLKeys.locked_key_return locked_key309 =null;

        PLSQLParser_PLSQLKeys.nowait_key_return nowait_key310 =null;

        PLSQLParser_PLSQLKeys.wait_key_return wait_key311 =null;

        PLSQLParser_PLSQL_DMLParser.expression_return expression312 =null;


        RewriteRuleSubtreeStream stream_expression=new RewriteRuleSubtreeStream(adaptor,"rule expression");
        RewriteRuleSubtreeStream stream_wait_key=new RewriteRuleSubtreeStream(adaptor,"rule wait_key");
        try {
            // PLSQL_DMLParser.g:531:5: ( skip_key locked_key !| nowait_key | wait_key expression -> ^( wait_key ^( EXPR expression ) ) )
            int alt102=3;
            int LA102_0 = input.LA(1);

            if ( (LA102_0==REGULAR_ID) && (((input.LT(1).getText().equalsIgnoreCase("skip"))||(input.LT(1).getText().equalsIgnoreCase("wait"))))) {
                int LA102_1 = input.LA(2);

                if ( (LA102_1==REGULAR_ID) && (((input.LT(1).getText().equalsIgnoreCase("skip"))||(input.LT(1).getText().equalsIgnoreCase("wait"))))) {
                    int LA102_3 = input.LA(3);

                    if ( ((input.LT(1).getText().equalsIgnoreCase("skip"))) ) {
                        alt102=1;
                    }
                    else if ( ((input.LT(1).getText().equalsIgnoreCase("wait"))) ) {
                        alt102=3;
                    }
                    else {
                        if (state.backtracking>0) {state.failed=true; return retval;}
                        NoViableAltException nvae =
                            new NoViableAltException("", 102, 3, input);

                        throw nvae;

                    }
                }
                else if ( (LA102_1==APPROXIMATE_NUM_LIT||(LA102_1 >= CHAR_STRING && LA102_1 <= COLON)||LA102_1==DELIMITED_ID||LA102_1==EXACT_NUM_LIT||LA102_1==INTRODUCER||LA102_1==LEFT_PAREN||LA102_1==MINUS_SIGN||LA102_1==PLUS_SIGN||LA102_1==SQL92_RESERVED_ALL||LA102_1==SQL92_RESERVED_ANY||LA102_1==SQL92_RESERVED_CASE||LA102_1==SQL92_RESERVED_DEFAULT||LA102_1==SQL92_RESERVED_DISTINCT||(LA102_1 >= SQL92_RESERVED_EXISTS && LA102_1 <= SQL92_RESERVED_FALSE)||(LA102_1 >= SQL92_RESERVED_NOT && LA102_1 <= SQL92_RESERVED_NULL)||LA102_1==SQL92_RESERVED_PRIOR||LA102_1==SQL92_RESERVED_TRUE||LA102_1==UNSIGNED_INTEGER) && ((input.LT(1).getText().equalsIgnoreCase("wait")))) {
                    alt102=3;
                }
                else {
                    if (state.backtracking>0) {state.failed=true; return retval;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 102, 1, input);

                    throw nvae;

                }
            }
            else if ( (LA102_0==PLSQL_RESERVED_NOWAIT) ) {
                alt102=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return retval;}
                NoViableAltException nvae =
                    new NoViableAltException("", 102, 0, input);

                throw nvae;

            }
            switch (alt102) {
                case 1 :
                    // PLSQL_DMLParser.g:531:10: skip_key locked_key !
                    {
                    root_0 = (Object)adaptor.nil();


                    pushFollow(FOLLOW_skip_key_in_for_update_options4482);
                    skip_key308=gPLSQLParser.skip_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, skip_key308.getTree());

                    pushFollow(FOLLOW_locked_key_in_for_update_options4484);
                    locked_key309=gPLSQLParser.locked_key();

                    state._fsp--;
                    if (state.failed) return retval;

                    }
                    break;
                case 2 :
                    // PLSQL_DMLParser.g:532:10: nowait_key
                    {
                    root_0 = (Object)adaptor.nil();


                    pushFollow(FOLLOW_nowait_key_in_for_update_options4496);
                    nowait_key310=gPLSQLParser.nowait_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, nowait_key310.getTree());

                    }
                    break;
                case 3 :
                    // PLSQL_DMLParser.g:533:10: wait_key expression
                    {
                    pushFollow(FOLLOW_wait_key_in_for_update_options4507);
                    wait_key311=gPLSQLParser.wait_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_wait_key.add(wait_key311.getTree());

                    pushFollow(FOLLOW_expression_in_for_update_options4509);
                    expression312=expression();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_expression.add(expression312.getTree());

                    // AST REWRITE
                    // elements: expression, wait_key
                    // token labels: 
                    // rule labels: retval
                    // token list labels: 
                    // rule list labels: 
                    // wildcard labels: 
                    if ( state.backtracking==0 ) {

                    retval.tree = root_0;
                    RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

                    root_0 = (Object)adaptor.nil();
                    // 533:30: -> ^( wait_key ^( EXPR expression ) )
                    {
                        // PLSQL_DMLParser.g:533:33: ^( wait_key ^( EXPR expression ) )
                        {
                        Object root_1 = (Object)adaptor.nil();
                        root_1 = (Object)adaptor.becomeRoot(stream_wait_key.nextNode(), root_1);

                        // PLSQL_DMLParser.g:533:44: ^( EXPR expression )
                        {
                        Object root_2 = (Object)adaptor.nil();
                        root_2 = (Object)adaptor.becomeRoot(
                        (Object)adaptor.create(EXPR, "EXPR")
                        , root_2);

                        adaptor.addChild(root_2, stream_expression.nextTree());

                        adaptor.addChild(root_1, root_2);
                        }

                        adaptor.addChild(root_0, root_1);
                        }

                    }


                    retval.tree = root_0;
                    }

                    }
                    break;

            }
            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "for_update_options"


    public static class update_statement_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "update_statement"
    // PLSQL_DMLParser.g:538:1: update_statement : update_key ^ general_table_ref update_set_clause ( where_clause )? ( static_returning_clause )? ( error_logging_clause )? ;
    public final PLSQLParser_PLSQL_DMLParser.update_statement_return update_statement() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.update_statement_return retval = new PLSQLParser_PLSQL_DMLParser.update_statement_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        PLSQLParser_PLSQLKeys.update_key_return update_key313 =null;

        PLSQLParser_PLSQL_DMLParser.general_table_ref_return general_table_ref314 =null;

        PLSQLParser_PLSQL_DMLParser.update_set_clause_return update_set_clause315 =null;

        PLSQLParser_PLSQLCommons.where_clause_return where_clause316 =null;

        PLSQLParser_PLSQL_DMLParser.static_returning_clause_return static_returning_clause317 =null;

        PLSQLParser_PLSQL_DMLParser.error_logging_clause_return error_logging_clause318 =null;



        try {
            // PLSQL_DMLParser.g:539:5: ( update_key ^ general_table_ref update_set_clause ( where_clause )? ( static_returning_clause )? ( error_logging_clause )? )
            // PLSQL_DMLParser.g:539:10: update_key ^ general_table_ref update_set_clause ( where_clause )? ( static_returning_clause )? ( error_logging_clause )?
            {
            root_0 = (Object)adaptor.nil();


            pushFollow(FOLLOW_update_key_in_update_statement4543);
            update_key313=gPLSQLParser.update_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) root_0 = (Object)adaptor.becomeRoot(update_key313.getTree(), root_0);

            pushFollow(FOLLOW_general_table_ref_in_update_statement4546);
            general_table_ref314=general_table_ref();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) adaptor.addChild(root_0, general_table_ref314.getTree());

            pushFollow(FOLLOW_update_set_clause_in_update_statement4556);
            update_set_clause315=update_set_clause();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) adaptor.addChild(root_0, update_set_clause315.getTree());

            // PLSQL_DMLParser.g:541:9: ( where_clause )?
            int alt103=2;
            int LA103_0 = input.LA(1);

            if ( (LA103_0==SQL92_RESERVED_WHERE) ) {
                alt103=1;
            }
            switch (alt103) {
                case 1 :
                    // PLSQL_DMLParser.g:541:9: where_clause
                    {
                    pushFollow(FOLLOW_where_clause_in_update_statement4566);
                    where_clause316=gPLSQLParser.where_clause();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, where_clause316.getTree());

                    }
                    break;

            }


            // PLSQL_DMLParser.g:541:23: ( static_returning_clause )?
            int alt104=2;
            int LA104_0 = input.LA(1);

            if ( (LA104_0==REGULAR_ID) ) {
                int LA104_1 = input.LA(2);

                if ( (((input.LT(1).getText().equalsIgnoreCase("returning"))||(input.LT(1).getText().equalsIgnoreCase("return")))) ) {
                    alt104=1;
                }
            }
            switch (alt104) {
                case 1 :
                    // PLSQL_DMLParser.g:541:23: static_returning_clause
                    {
                    pushFollow(FOLLOW_static_returning_clause_in_update_statement4569);
                    static_returning_clause317=static_returning_clause();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, static_returning_clause317.getTree());

                    }
                    break;

            }


            // PLSQL_DMLParser.g:541:48: ( error_logging_clause )?
            int alt105=2;
            int LA105_0 = input.LA(1);

            if ( (LA105_0==REGULAR_ID) ) {
                int LA105_1 = input.LA(2);

                if ( (LA105_1==REGULAR_ID) && ((input.LT(1).getText().equalsIgnoreCase("log")))) {
                    alt105=1;
                }
            }
            switch (alt105) {
                case 1 :
                    // PLSQL_DMLParser.g:541:48: error_logging_clause
                    {
                    pushFollow(FOLLOW_error_logging_clause_in_update_statement4572);
                    error_logging_clause318=error_logging_clause();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, error_logging_clause318.getTree());

                    }
                    break;

            }


            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "update_statement"


    public static class update_set_clause_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "update_set_clause"
    // PLSQL_DMLParser.g:545:1: update_set_clause : set_key ( column_based_update_set_clause ( COMMA column_based_update_set_clause )* | value_key LEFT_PAREN id RIGHT_PAREN EQUALS_OP expression ) -> {mode == 1}? ^( set_key ( column_based_update_set_clause )+ ) -> ^( set_key ^( value_key id ^( EXPR expression ) ) ) ;
    public final PLSQLParser_PLSQL_DMLParser.update_set_clause_return update_set_clause() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.update_set_clause_return retval = new PLSQLParser_PLSQL_DMLParser.update_set_clause_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token COMMA321=null;
        Token LEFT_PAREN324=null;
        Token RIGHT_PAREN326=null;
        Token EQUALS_OP327=null;
        PLSQLParser_PLSQLKeys.set_key_return set_key319 =null;

        PLSQLParser_PLSQL_DMLParser.column_based_update_set_clause_return column_based_update_set_clause320 =null;

        PLSQLParser_PLSQL_DMLParser.column_based_update_set_clause_return column_based_update_set_clause322 =null;

        PLSQLParser_PLSQLKeys.value_key_return value_key323 =null;

        PLSQLParser_PLSQLCommons.id_return id325 =null;

        PLSQLParser_PLSQL_DMLParser.expression_return expression328 =null;


        Object COMMA321_tree=null;
        Object LEFT_PAREN324_tree=null;
        Object RIGHT_PAREN326_tree=null;
        Object EQUALS_OP327_tree=null;
        RewriteRuleTokenStream stream_LEFT_PAREN=new RewriteRuleTokenStream(adaptor,"token LEFT_PAREN");
        RewriteRuleTokenStream stream_RIGHT_PAREN=new RewriteRuleTokenStream(adaptor,"token RIGHT_PAREN");
        RewriteRuleTokenStream stream_COMMA=new RewriteRuleTokenStream(adaptor,"token COMMA");
        RewriteRuleTokenStream stream_EQUALS_OP=new RewriteRuleTokenStream(adaptor,"token EQUALS_OP");
        RewriteRuleSubtreeStream stream_id=new RewriteRuleSubtreeStream(adaptor,"rule id");
        RewriteRuleSubtreeStream stream_expression=new RewriteRuleSubtreeStream(adaptor,"rule expression");
        RewriteRuleSubtreeStream stream_value_key=new RewriteRuleSubtreeStream(adaptor,"rule value_key");
        RewriteRuleSubtreeStream stream_column_based_update_set_clause=new RewriteRuleSubtreeStream(adaptor,"rule column_based_update_set_clause");
        RewriteRuleSubtreeStream stream_set_key=new RewriteRuleSubtreeStream(adaptor,"rule set_key");
            int mode = 0;    
        try {
            // PLSQL_DMLParser.g:547:5: ( set_key ( column_based_update_set_clause ( COMMA column_based_update_set_clause )* | value_key LEFT_PAREN id RIGHT_PAREN EQUALS_OP expression ) -> {mode == 1}? ^( set_key ( column_based_update_set_clause )+ ) -> ^( set_key ^( value_key id ^( EXPR expression ) ) ) )
            // PLSQL_DMLParser.g:547:10: set_key ( column_based_update_set_clause ( COMMA column_based_update_set_clause )* | value_key LEFT_PAREN id RIGHT_PAREN EQUALS_OP expression )
            {
            pushFollow(FOLLOW_set_key_in_update_set_clause4602);
            set_key319=gPLSQLParser.set_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_set_key.add(set_key319.getTree());

            // PLSQL_DMLParser.g:548:5: ( column_based_update_set_clause ( COMMA column_based_update_set_clause )* | value_key LEFT_PAREN id RIGHT_PAREN EQUALS_OP expression )
            int alt107=2;
            int LA107_0 = input.LA(1);

            if ( (LA107_0==DELIMITED_ID||LA107_0==INTRODUCER||LA107_0==LEFT_PAREN) ) {
                alt107=1;
            }
            else if ( (LA107_0==REGULAR_ID) ) {
                int LA107_2 = input.LA(2);

                if ( (LA107_2==EQUALS_OP||LA107_2==PERIOD) ) {
                    alt107=1;
                }
                else if ( (LA107_2==LEFT_PAREN) ) {
                    alt107=2;
                }
                else {
                    if (state.backtracking>0) {state.failed=true; return retval;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 107, 2, input);

                    throw nvae;

                }
            }
            else {
                if (state.backtracking>0) {state.failed=true; return retval;}
                NoViableAltException nvae =
                    new NoViableAltException("", 107, 0, input);

                throw nvae;

            }
            switch (alt107) {
                case 1 :
                    // PLSQL_DMLParser.g:548:10: column_based_update_set_clause ( COMMA column_based_update_set_clause )*
                    {
                    pushFollow(FOLLOW_column_based_update_set_clause_in_update_set_clause4613);
                    column_based_update_set_clause320=column_based_update_set_clause();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_column_based_update_set_clause.add(column_based_update_set_clause320.getTree());

                    // PLSQL_DMLParser.g:548:41: ( COMMA column_based_update_set_clause )*
                    loop106:
                    do {
                        int alt106=2;
                        int LA106_0 = input.LA(1);

                        if ( (LA106_0==COMMA) ) {
                            alt106=1;
                        }


                        switch (alt106) {
                    	case 1 :
                    	    // PLSQL_DMLParser.g:548:42: COMMA column_based_update_set_clause
                    	    {
                    	    COMMA321=(Token)match(input,COMMA,FOLLOW_COMMA_in_update_set_clause4616); if (state.failed) return retval; 
                    	    if ( state.backtracking==0 ) stream_COMMA.add(COMMA321);


                    	    pushFollow(FOLLOW_column_based_update_set_clause_in_update_set_clause4618);
                    	    column_based_update_set_clause322=column_based_update_set_clause();

                    	    state._fsp--;
                    	    if (state.failed) return retval;
                    	    if ( state.backtracking==0 ) stream_column_based_update_set_clause.add(column_based_update_set_clause322.getTree());

                    	    }
                    	    break;

                    	default :
                    	    break loop106;
                        }
                    } while (true);


                    if ( state.backtracking==0 ) {mode = 1;}

                    }
                    break;
                case 2 :
                    // PLSQL_DMLParser.g:549:10: value_key LEFT_PAREN id RIGHT_PAREN EQUALS_OP expression
                    {
                    pushFollow(FOLLOW_value_key_in_update_set_clause4633);
                    value_key323=gPLSQLParser.value_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_value_key.add(value_key323.getTree());

                    LEFT_PAREN324=(Token)match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_update_set_clause4635); if (state.failed) return retval; 
                    if ( state.backtracking==0 ) stream_LEFT_PAREN.add(LEFT_PAREN324);


                    pushFollow(FOLLOW_id_in_update_set_clause4637);
                    id325=gPLSQLParser.id();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_id.add(id325.getTree());

                    RIGHT_PAREN326=(Token)match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_update_set_clause4639); if (state.failed) return retval; 
                    if ( state.backtracking==0 ) stream_RIGHT_PAREN.add(RIGHT_PAREN326);


                    EQUALS_OP327=(Token)match(input,EQUALS_OP,FOLLOW_EQUALS_OP_in_update_set_clause4641); if (state.failed) return retval; 
                    if ( state.backtracking==0 ) stream_EQUALS_OP.add(EQUALS_OP327);


                    pushFollow(FOLLOW_expression_in_update_set_clause4643);
                    expression328=expression();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_expression.add(expression328.getTree());

                    }
                    break;

            }


            // AST REWRITE
            // elements: value_key, set_key, column_based_update_set_clause, set_key, expression, id
            // token labels: 
            // rule labels: retval
            // token list labels: 
            // rule list labels: 
            // wildcard labels: 
            if ( state.backtracking==0 ) {

            retval.tree = root_0;
            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

            root_0 = (Object)adaptor.nil();
            // 551:9: -> {mode == 1}? ^( set_key ( column_based_update_set_clause )+ )
            if (mode == 1) {
                // PLSQL_DMLParser.g:551:24: ^( set_key ( column_based_update_set_clause )+ )
                {
                Object root_1 = (Object)adaptor.nil();
                root_1 = (Object)adaptor.becomeRoot(stream_set_key.nextNode(), root_1);

                if ( !(stream_column_based_update_set_clause.hasNext()) ) {
                    throw new RewriteEarlyExitException();
                }
                while ( stream_column_based_update_set_clause.hasNext() ) {
                    adaptor.addChild(root_1, stream_column_based_update_set_clause.nextTree());

                }
                stream_column_based_update_set_clause.reset();

                adaptor.addChild(root_0, root_1);
                }

            }

            else // 552:9: -> ^( set_key ^( value_key id ^( EXPR expression ) ) )
            {
                // PLSQL_DMLParser.g:552:12: ^( set_key ^( value_key id ^( EXPR expression ) ) )
                {
                Object root_1 = (Object)adaptor.nil();
                root_1 = (Object)adaptor.becomeRoot(stream_set_key.nextNode(), root_1);

                // PLSQL_DMLParser.g:552:22: ^( value_key id ^( EXPR expression ) )
                {
                Object root_2 = (Object)adaptor.nil();
                root_2 = (Object)adaptor.becomeRoot(stream_value_key.nextNode(), root_2);

                adaptor.addChild(root_2, stream_id.nextTree());

                // PLSQL_DMLParser.g:552:37: ^( EXPR expression )
                {
                Object root_3 = (Object)adaptor.nil();
                root_3 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(EXPR, "EXPR")
                , root_3);

                adaptor.addChild(root_3, stream_expression.nextTree());

                adaptor.addChild(root_2, root_3);
                }

                adaptor.addChild(root_1, root_2);
                }

                adaptor.addChild(root_0, root_1);
                }

            }


            retval.tree = root_0;
            }

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "update_set_clause"


    public static class column_based_update_set_clause_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "column_based_update_set_clause"
    // PLSQL_DMLParser.g:555:1: column_based_update_set_clause : ( column_name EQUALS_OP expression -> ^( ASSIGN[$EQUALS_OP] column_name ^( EXPR expression ) ) | LEFT_PAREN column_name ( COMMA column_name )* RIGHT_PAREN EQUALS_OP subquery -> ^( ASSIGN[$EQUALS_OP] ( column_name )+ subquery ) );
    public final PLSQLParser_PLSQL_DMLParser.column_based_update_set_clause_return column_based_update_set_clause() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.column_based_update_set_clause_return retval = new PLSQLParser_PLSQL_DMLParser.column_based_update_set_clause_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token EQUALS_OP330=null;
        Token LEFT_PAREN332=null;
        Token COMMA334=null;
        Token RIGHT_PAREN336=null;
        Token EQUALS_OP337=null;
        PLSQLParser_PLSQLCommons.column_name_return column_name329 =null;

        PLSQLParser_PLSQL_DMLParser.expression_return expression331 =null;

        PLSQLParser_PLSQLCommons.column_name_return column_name333 =null;

        PLSQLParser_PLSQLCommons.column_name_return column_name335 =null;

        PLSQLParser_PLSQL_DMLParser.subquery_return subquery338 =null;


        Object EQUALS_OP330_tree=null;
        Object LEFT_PAREN332_tree=null;
        Object COMMA334_tree=null;
        Object RIGHT_PAREN336_tree=null;
        Object EQUALS_OP337_tree=null;
        RewriteRuleTokenStream stream_LEFT_PAREN=new RewriteRuleTokenStream(adaptor,"token LEFT_PAREN");
        RewriteRuleTokenStream stream_RIGHT_PAREN=new RewriteRuleTokenStream(adaptor,"token RIGHT_PAREN");
        RewriteRuleTokenStream stream_COMMA=new RewriteRuleTokenStream(adaptor,"token COMMA");
        RewriteRuleTokenStream stream_EQUALS_OP=new RewriteRuleTokenStream(adaptor,"token EQUALS_OP");
        RewriteRuleSubtreeStream stream_expression=new RewriteRuleSubtreeStream(adaptor,"rule expression");
        RewriteRuleSubtreeStream stream_column_name=new RewriteRuleSubtreeStream(adaptor,"rule column_name");
        RewriteRuleSubtreeStream stream_subquery=new RewriteRuleSubtreeStream(adaptor,"rule subquery");
        try {
            // PLSQL_DMLParser.g:556:5: ( column_name EQUALS_OP expression -> ^( ASSIGN[$EQUALS_OP] column_name ^( EXPR expression ) ) | LEFT_PAREN column_name ( COMMA column_name )* RIGHT_PAREN EQUALS_OP subquery -> ^( ASSIGN[$EQUALS_OP] ( column_name )+ subquery ) )
            int alt109=2;
            int LA109_0 = input.LA(1);

            if ( (LA109_0==DELIMITED_ID||LA109_0==INTRODUCER||LA109_0==REGULAR_ID) ) {
                alt109=1;
            }
            else if ( (LA109_0==LEFT_PAREN) ) {
                alt109=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return retval;}
                NoViableAltException nvae =
                    new NoViableAltException("", 109, 0, input);

                throw nvae;

            }
            switch (alt109) {
                case 1 :
                    // PLSQL_DMLParser.g:556:10: column_name EQUALS_OP expression
                    {
                    pushFollow(FOLLOW_column_name_in_column_based_update_set_clause4713);
                    column_name329=gPLSQLParser.column_name();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_column_name.add(column_name329.getTree());

                    EQUALS_OP330=(Token)match(input,EQUALS_OP,FOLLOW_EQUALS_OP_in_column_based_update_set_clause4715); if (state.failed) return retval; 
                    if ( state.backtracking==0 ) stream_EQUALS_OP.add(EQUALS_OP330);


                    pushFollow(FOLLOW_expression_in_column_based_update_set_clause4717);
                    expression331=expression();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_expression.add(expression331.getTree());

                    // AST REWRITE
                    // elements: expression, column_name
                    // token labels: 
                    // rule labels: retval
                    // token list labels: 
                    // rule list labels: 
                    // wildcard labels: 
                    if ( state.backtracking==0 ) {

                    retval.tree = root_0;
                    RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

                    root_0 = (Object)adaptor.nil();
                    // 556:43: -> ^( ASSIGN[$EQUALS_OP] column_name ^( EXPR expression ) )
                    {
                        // PLSQL_DMLParser.g:556:46: ^( ASSIGN[$EQUALS_OP] column_name ^( EXPR expression ) )
                        {
                        Object root_1 = (Object)adaptor.nil();
                        root_1 = (Object)adaptor.becomeRoot(
                        (Object)adaptor.create(ASSIGN, EQUALS_OP330)
                        , root_1);

                        adaptor.addChild(root_1, stream_column_name.nextTree());

                        // PLSQL_DMLParser.g:556:79: ^( EXPR expression )
                        {
                        Object root_2 = (Object)adaptor.nil();
                        root_2 = (Object)adaptor.becomeRoot(
                        (Object)adaptor.create(EXPR, "EXPR")
                        , root_2);

                        adaptor.addChild(root_2, stream_expression.nextTree());

                        adaptor.addChild(root_1, root_2);
                        }

                        adaptor.addChild(root_0, root_1);
                        }

                    }


                    retval.tree = root_0;
                    }

                    }
                    break;
                case 2 :
                    // PLSQL_DMLParser.g:557:10: LEFT_PAREN column_name ( COMMA column_name )* RIGHT_PAREN EQUALS_OP subquery
                    {
                    LEFT_PAREN332=(Token)match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_column_based_update_set_clause4743); if (state.failed) return retval; 
                    if ( state.backtracking==0 ) stream_LEFT_PAREN.add(LEFT_PAREN332);


                    pushFollow(FOLLOW_column_name_in_column_based_update_set_clause4745);
                    column_name333=gPLSQLParser.column_name();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_column_name.add(column_name333.getTree());

                    // PLSQL_DMLParser.g:557:33: ( COMMA column_name )*
                    loop108:
                    do {
                        int alt108=2;
                        int LA108_0 = input.LA(1);

                        if ( (LA108_0==COMMA) ) {
                            alt108=1;
                        }


                        switch (alt108) {
                    	case 1 :
                    	    // PLSQL_DMLParser.g:557:34: COMMA column_name
                    	    {
                    	    COMMA334=(Token)match(input,COMMA,FOLLOW_COMMA_in_column_based_update_set_clause4748); if (state.failed) return retval; 
                    	    if ( state.backtracking==0 ) stream_COMMA.add(COMMA334);


                    	    pushFollow(FOLLOW_column_name_in_column_based_update_set_clause4750);
                    	    column_name335=gPLSQLParser.column_name();

                    	    state._fsp--;
                    	    if (state.failed) return retval;
                    	    if ( state.backtracking==0 ) stream_column_name.add(column_name335.getTree());

                    	    }
                    	    break;

                    	default :
                    	    break loop108;
                        }
                    } while (true);


                    RIGHT_PAREN336=(Token)match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_column_based_update_set_clause4754); if (state.failed) return retval; 
                    if ( state.backtracking==0 ) stream_RIGHT_PAREN.add(RIGHT_PAREN336);


                    EQUALS_OP337=(Token)match(input,EQUALS_OP,FOLLOW_EQUALS_OP_in_column_based_update_set_clause4756); if (state.failed) return retval; 
                    if ( state.backtracking==0 ) stream_EQUALS_OP.add(EQUALS_OP337);


                    pushFollow(FOLLOW_subquery_in_column_based_update_set_clause4758);
                    subquery338=subquery();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_subquery.add(subquery338.getTree());

                    // AST REWRITE
                    // elements: subquery, column_name
                    // token labels: 
                    // rule labels: retval
                    // token list labels: 
                    // rule list labels: 
                    // wildcard labels: 
                    if ( state.backtracking==0 ) {

                    retval.tree = root_0;
                    RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

                    root_0 = (Object)adaptor.nil();
                    // 557:85: -> ^( ASSIGN[$EQUALS_OP] ( column_name )+ subquery )
                    {
                        // PLSQL_DMLParser.g:557:88: ^( ASSIGN[$EQUALS_OP] ( column_name )+ subquery )
                        {
                        Object root_1 = (Object)adaptor.nil();
                        root_1 = (Object)adaptor.becomeRoot(
                        (Object)adaptor.create(ASSIGN, EQUALS_OP337)
                        , root_1);

                        if ( !(stream_column_name.hasNext()) ) {
                            throw new RewriteEarlyExitException();
                        }
                        while ( stream_column_name.hasNext() ) {
                            adaptor.addChild(root_1, stream_column_name.nextTree());

                        }
                        stream_column_name.reset();

                        adaptor.addChild(root_1, stream_subquery.nextTree());

                        adaptor.addChild(root_0, root_1);
                        }

                    }


                    retval.tree = root_0;
                    }

                    }
                    break;

            }
            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "column_based_update_set_clause"


    public static class delete_statement_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "delete_statement"
    // PLSQL_DMLParser.g:562:1: delete_statement : delete_key ^ ( from_key !)? general_table_ref ( where_clause )? ( static_returning_clause )? ( error_logging_clause )? ;
    public final PLSQLParser_PLSQL_DMLParser.delete_statement_return delete_statement() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.delete_statement_return retval = new PLSQLParser_PLSQL_DMLParser.delete_statement_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        PLSQLParser_PLSQLKeys.delete_key_return delete_key339 =null;

        PLSQLParser_PLSQLKeys.from_key_return from_key340 =null;

        PLSQLParser_PLSQL_DMLParser.general_table_ref_return general_table_ref341 =null;

        PLSQLParser_PLSQLCommons.where_clause_return where_clause342 =null;

        PLSQLParser_PLSQL_DMLParser.static_returning_clause_return static_returning_clause343 =null;

        PLSQLParser_PLSQL_DMLParser.error_logging_clause_return error_logging_clause344 =null;



        try {
            // PLSQL_DMLParser.g:563:5: ( delete_key ^ ( from_key !)? general_table_ref ( where_clause )? ( static_returning_clause )? ( error_logging_clause )? )
            // PLSQL_DMLParser.g:563:10: delete_key ^ ( from_key !)? general_table_ref ( where_clause )? ( static_returning_clause )? ( error_logging_clause )?
            {
            root_0 = (Object)adaptor.nil();


            pushFollow(FOLLOW_delete_key_in_delete_statement4792);
            delete_key339=gPLSQLParser.delete_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) root_0 = (Object)adaptor.becomeRoot(delete_key339.getTree(), root_0);

            // PLSQL_DMLParser.g:563:30: ( from_key !)?
            int alt110=2;
            int LA110_0 = input.LA(1);

            if ( (LA110_0==SQL92_RESERVED_FROM) ) {
                alt110=1;
            }
            switch (alt110) {
                case 1 :
                    // PLSQL_DMLParser.g:563:30: from_key !
                    {
                    pushFollow(FOLLOW_from_key_in_delete_statement4795);
                    from_key340=gPLSQLParser.from_key();

                    state._fsp--;
                    if (state.failed) return retval;

                    }
                    break;

            }


            pushFollow(FOLLOW_general_table_ref_in_delete_statement4807);
            general_table_ref341=general_table_ref();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) adaptor.addChild(root_0, general_table_ref341.getTree());

            // PLSQL_DMLParser.g:565:9: ( where_clause )?
            int alt111=2;
            int LA111_0 = input.LA(1);

            if ( (LA111_0==SQL92_RESERVED_WHERE) ) {
                alt111=1;
            }
            switch (alt111) {
                case 1 :
                    // PLSQL_DMLParser.g:565:9: where_clause
                    {
                    pushFollow(FOLLOW_where_clause_in_delete_statement4817);
                    where_clause342=gPLSQLParser.where_clause();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, where_clause342.getTree());

                    }
                    break;

            }


            // PLSQL_DMLParser.g:565:23: ( static_returning_clause )?
            int alt112=2;
            int LA112_0 = input.LA(1);

            if ( (LA112_0==REGULAR_ID) ) {
                int LA112_1 = input.LA(2);

                if ( (((input.LT(1).getText().equalsIgnoreCase("returning"))||(input.LT(1).getText().equalsIgnoreCase("return")))) ) {
                    alt112=1;
                }
            }
            switch (alt112) {
                case 1 :
                    // PLSQL_DMLParser.g:565:23: static_returning_clause
                    {
                    pushFollow(FOLLOW_static_returning_clause_in_delete_statement4820);
                    static_returning_clause343=static_returning_clause();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, static_returning_clause343.getTree());

                    }
                    break;

            }


            // PLSQL_DMLParser.g:565:48: ( error_logging_clause )?
            int alt113=2;
            int LA113_0 = input.LA(1);

            if ( (LA113_0==REGULAR_ID) ) {
                int LA113_1 = input.LA(2);

                if ( (LA113_1==REGULAR_ID) && ((input.LT(1).getText().equalsIgnoreCase("log")))) {
                    alt113=1;
                }
            }
            switch (alt113) {
                case 1 :
                    // PLSQL_DMLParser.g:565:48: error_logging_clause
                    {
                    pushFollow(FOLLOW_error_logging_clause_in_delete_statement4823);
                    error_logging_clause344=error_logging_clause();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, error_logging_clause344.getTree());

                    }
                    break;

            }


            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "delete_statement"


    public static class insert_statement_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "insert_statement"
    // PLSQL_DMLParser.g:568:1: insert_statement : insert_key ( single_table_insert | multi_table_insert ) -> ^( INSERT_STATEMENT insert_key ( single_table_insert )? ( multi_table_insert )? ) ;
    public final PLSQLParser_PLSQL_DMLParser.insert_statement_return insert_statement() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.insert_statement_return retval = new PLSQLParser_PLSQL_DMLParser.insert_statement_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        PLSQLParser_PLSQLKeys.insert_key_return insert_key345 =null;

        PLSQLParser_PLSQL_DMLParser.single_table_insert_return single_table_insert346 =null;

        PLSQLParser_PLSQL_DMLParser.multi_table_insert_return multi_table_insert347 =null;


        RewriteRuleSubtreeStream stream_single_table_insert=new RewriteRuleSubtreeStream(adaptor,"rule single_table_insert");
        RewriteRuleSubtreeStream stream_insert_key=new RewriteRuleSubtreeStream(adaptor,"rule insert_key");
        RewriteRuleSubtreeStream stream_multi_table_insert=new RewriteRuleSubtreeStream(adaptor,"rule multi_table_insert");
        try {
            // PLSQL_DMLParser.g:569:5: ( insert_key ( single_table_insert | multi_table_insert ) -> ^( INSERT_STATEMENT insert_key ( single_table_insert )? ( multi_table_insert )? ) )
            // PLSQL_DMLParser.g:569:10: insert_key ( single_table_insert | multi_table_insert )
            {
            pushFollow(FOLLOW_insert_key_in_insert_statement4844);
            insert_key345=gPLSQLParser.insert_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_insert_key.add(insert_key345.getTree());

            // PLSQL_DMLParser.g:570:5: ( single_table_insert | multi_table_insert )
            int alt114=2;
            int LA114_0 = input.LA(1);

            if ( (LA114_0==SQL92_RESERVED_INTO) ) {
                alt114=1;
            }
            else if ( (LA114_0==SQL92_RESERVED_ALL) ) {
                alt114=2;
            }
            else if ( (LA114_0==REGULAR_ID) && ((input.LT(1).getText().equalsIgnoreCase("first")))) {
                alt114=2;
            }
            else if ( (LA114_0==SQL92_RESERVED_WHEN) ) {
                alt114=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return retval;}
                NoViableAltException nvae =
                    new NoViableAltException("", 114, 0, input);

                throw nvae;

            }
            switch (alt114) {
                case 1 :
                    // PLSQL_DMLParser.g:570:10: single_table_insert
                    {
                    pushFollow(FOLLOW_single_table_insert_in_insert_statement4855);
                    single_table_insert346=single_table_insert();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_single_table_insert.add(single_table_insert346.getTree());

                    }
                    break;
                case 2 :
                    // PLSQL_DMLParser.g:571:10: multi_table_insert
                    {
                    pushFollow(FOLLOW_multi_table_insert_in_insert_statement4866);
                    multi_table_insert347=multi_table_insert();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_multi_table_insert.add(multi_table_insert347.getTree());

                    }
                    break;

            }


            // AST REWRITE
            // elements: insert_key, single_table_insert, multi_table_insert
            // token labels: 
            // rule labels: retval
            // token list labels: 
            // rule list labels: 
            // wildcard labels: 
            if ( state.backtracking==0 ) {

            retval.tree = root_0;
            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

            root_0 = (Object)adaptor.nil();
            // 572:7: -> ^( INSERT_STATEMENT insert_key ( single_table_insert )? ( multi_table_insert )? )
            {
                // PLSQL_DMLParser.g:572:10: ^( INSERT_STATEMENT insert_key ( single_table_insert )? ( multi_table_insert )? )
                {
                Object root_1 = (Object)adaptor.nil();
                root_1 = (Object)adaptor.becomeRoot(
                new InsertStmt(INSERT_STATEMENT)
                , root_1);

                adaptor.addChild(root_1, stream_insert_key.nextTree());

                // PLSQL_DMLParser.g:572:52: ( single_table_insert )?
                if ( stream_single_table_insert.hasNext() ) {
                    adaptor.addChild(root_1, stream_single_table_insert.nextTree());

                }
                stream_single_table_insert.reset();

                // PLSQL_DMLParser.g:572:73: ( multi_table_insert )?
                if ( stream_multi_table_insert.hasNext() ) {
                    adaptor.addChild(root_1, stream_multi_table_insert.nextTree());

                }
                stream_multi_table_insert.reset();

                adaptor.addChild(root_0, root_1);
                }

            }


            retval.tree = root_0;
            }

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "insert_statement"


    public static class single_table_insert_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "single_table_insert"
    // PLSQL_DMLParser.g:577:1: single_table_insert : insert_into_clause ( values_clause ( static_returning_clause )? | select_statement ) ( error_logging_clause )? -> ^( SINGLE_TABLE_MODE insert_into_clause ( values_clause )? ( static_returning_clause )? ( select_statement )? ( error_logging_clause )? ) ;
    public final PLSQLParser_PLSQL_DMLParser.single_table_insert_return single_table_insert() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.single_table_insert_return retval = new PLSQLParser_PLSQL_DMLParser.single_table_insert_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        PLSQLParser_PLSQL_DMLParser.insert_into_clause_return insert_into_clause348 =null;

        PLSQLParser_PLSQL_DMLParser.values_clause_return values_clause349 =null;

        PLSQLParser_PLSQL_DMLParser.static_returning_clause_return static_returning_clause350 =null;

        PLSQLParser_PLSQL_DMLParser.select_statement_return select_statement351 =null;

        PLSQLParser_PLSQL_DMLParser.error_logging_clause_return error_logging_clause352 =null;


        RewriteRuleSubtreeStream stream_static_returning_clause=new RewriteRuleSubtreeStream(adaptor,"rule static_returning_clause");
        RewriteRuleSubtreeStream stream_values_clause=new RewriteRuleSubtreeStream(adaptor,"rule values_clause");
        RewriteRuleSubtreeStream stream_insert_into_clause=new RewriteRuleSubtreeStream(adaptor,"rule insert_into_clause");
        RewriteRuleSubtreeStream stream_error_logging_clause=new RewriteRuleSubtreeStream(adaptor,"rule error_logging_clause");
        RewriteRuleSubtreeStream stream_select_statement=new RewriteRuleSubtreeStream(adaptor,"rule select_statement");
        try {
            // PLSQL_DMLParser.g:578:5: ( insert_into_clause ( values_clause ( static_returning_clause )? | select_statement ) ( error_logging_clause )? -> ^( SINGLE_TABLE_MODE insert_into_clause ( values_clause )? ( static_returning_clause )? ( select_statement )? ( error_logging_clause )? ) )
            // PLSQL_DMLParser.g:578:10: insert_into_clause ( values_clause ( static_returning_clause )? | select_statement ) ( error_logging_clause )?
            {
            pushFollow(FOLLOW_insert_into_clause_in_single_table_insert4911);
            insert_into_clause348=insert_into_clause();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_insert_into_clause.add(insert_into_clause348.getTree());

            // PLSQL_DMLParser.g:579:5: ( values_clause ( static_returning_clause )? | select_statement )
            int alt116=2;
            int LA116_0 = input.LA(1);

            if ( (LA116_0==SQL92_RESERVED_VALUES) ) {
                alt116=1;
            }
            else if ( (LA116_0==LEFT_PAREN||LA116_0==SQL92_RESERVED_SELECT||LA116_0==SQL92_RESERVED_WITH) ) {
                alt116=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return retval;}
                NoViableAltException nvae =
                    new NoViableAltException("", 116, 0, input);

                throw nvae;

            }
            switch (alt116) {
                case 1 :
                    // PLSQL_DMLParser.g:579:10: values_clause ( static_returning_clause )?
                    {
                    pushFollow(FOLLOW_values_clause_in_single_table_insert4922);
                    values_clause349=values_clause();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_values_clause.add(values_clause349.getTree());

                    // PLSQL_DMLParser.g:579:24: ( static_returning_clause )?
                    int alt115=2;
                    int LA115_0 = input.LA(1);

                    if ( (LA115_0==REGULAR_ID) ) {
                        int LA115_1 = input.LA(2);

                        if ( (((input.LT(1).getText().equalsIgnoreCase("returning"))||(input.LT(1).getText().equalsIgnoreCase("return")))) ) {
                            alt115=1;
                        }
                    }
                    switch (alt115) {
                        case 1 :
                            // PLSQL_DMLParser.g:579:24: static_returning_clause
                            {
                            pushFollow(FOLLOW_static_returning_clause_in_single_table_insert4924);
                            static_returning_clause350=static_returning_clause();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) stream_static_returning_clause.add(static_returning_clause350.getTree());

                            }
                            break;

                    }


                    }
                    break;
                case 2 :
                    // PLSQL_DMLParser.g:580:10: select_statement
                    {
                    pushFollow(FOLLOW_select_statement_in_single_table_insert4936);
                    select_statement351=select_statement();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_select_statement.add(select_statement351.getTree());

                    }
                    break;

            }


            // PLSQL_DMLParser.g:582:9: ( error_logging_clause )?
            int alt117=2;
            int LA117_0 = input.LA(1);

            if ( (LA117_0==REGULAR_ID) ) {
                int LA117_1 = input.LA(2);

                if ( (LA117_1==REGULAR_ID) && ((input.LT(1).getText().equalsIgnoreCase("log")))) {
                    alt117=1;
                }
            }
            switch (alt117) {
                case 1 :
                    // PLSQL_DMLParser.g:582:9: error_logging_clause
                    {
                    pushFollow(FOLLOW_error_logging_clause_in_single_table_insert4952);
                    error_logging_clause352=error_logging_clause();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_error_logging_clause.add(error_logging_clause352.getTree());

                    }
                    break;

            }


            // AST REWRITE
            // elements: select_statement, values_clause, error_logging_clause, static_returning_clause, insert_into_clause
            // token labels: 
            // rule labels: retval
            // token list labels: 
            // rule list labels: 
            // wildcard labels: 
            if ( state.backtracking==0 ) {

            retval.tree = root_0;
            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

            root_0 = (Object)adaptor.nil();
            // 583:9: -> ^( SINGLE_TABLE_MODE insert_into_clause ( values_clause )? ( static_returning_clause )? ( select_statement )? ( error_logging_clause )? )
            {
                // PLSQL_DMLParser.g:583:12: ^( SINGLE_TABLE_MODE insert_into_clause ( values_clause )? ( static_returning_clause )? ( select_statement )? ( error_logging_clause )? )
                {
                Object root_1 = (Object)adaptor.nil();
                root_1 = (Object)adaptor.becomeRoot(
                new SingleTableMode(SINGLE_TABLE_MODE)
                , root_1);

                adaptor.addChild(root_1, stream_insert_into_clause.nextTree());

                // PLSQL_DMLParser.g:583:68: ( values_clause )?
                if ( stream_values_clause.hasNext() ) {
                    adaptor.addChild(root_1, stream_values_clause.nextTree());

                }
                stream_values_clause.reset();

                // PLSQL_DMLParser.g:583:83: ( static_returning_clause )?
                if ( stream_static_returning_clause.hasNext() ) {
                    adaptor.addChild(root_1, stream_static_returning_clause.nextTree());

                }
                stream_static_returning_clause.reset();

                // PLSQL_DMLParser.g:583:108: ( select_statement )?
                if ( stream_select_statement.hasNext() ) {
                    adaptor.addChild(root_1, stream_select_statement.nextTree());

                }
                stream_select_statement.reset();

                // PLSQL_DMLParser.g:583:126: ( error_logging_clause )?
                if ( stream_error_logging_clause.hasNext() ) {
                    adaptor.addChild(root_1, stream_error_logging_clause.nextTree());

                }
                stream_error_logging_clause.reset();

                adaptor.addChild(root_0, root_1);
                }

            }


            retval.tree = root_0;
            }

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "single_table_insert"


    public static class multi_table_insert_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "multi_table_insert"
    // PLSQL_DMLParser.g:586:1: multi_table_insert : ( all_key ( multi_table_element )+ | conditional_insert_clause ) select_statement -> ^( MULTI_TABLE_MODE select_statement ( multi_table_element )* ( conditional_insert_clause )? ) ;
    public final PLSQLParser_PLSQL_DMLParser.multi_table_insert_return multi_table_insert() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.multi_table_insert_return retval = new PLSQLParser_PLSQL_DMLParser.multi_table_insert_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        PLSQLParser_PLSQLKeys.all_key_return all_key353 =null;

        PLSQLParser_PLSQL_DMLParser.multi_table_element_return multi_table_element354 =null;

        PLSQLParser_PLSQL_DMLParser.conditional_insert_clause_return conditional_insert_clause355 =null;

        PLSQLParser_PLSQL_DMLParser.select_statement_return select_statement356 =null;


        RewriteRuleSubtreeStream stream_all_key=new RewriteRuleSubtreeStream(adaptor,"rule all_key");
        RewriteRuleSubtreeStream stream_multi_table_element=new RewriteRuleSubtreeStream(adaptor,"rule multi_table_element");
        RewriteRuleSubtreeStream stream_conditional_insert_clause=new RewriteRuleSubtreeStream(adaptor,"rule conditional_insert_clause");
        RewriteRuleSubtreeStream stream_select_statement=new RewriteRuleSubtreeStream(adaptor,"rule select_statement");
        try {
            // PLSQL_DMLParser.g:587:5: ( ( all_key ( multi_table_element )+ | conditional_insert_clause ) select_statement -> ^( MULTI_TABLE_MODE select_statement ( multi_table_element )* ( conditional_insert_clause )? ) )
            // PLSQL_DMLParser.g:588:5: ( all_key ( multi_table_element )+ | conditional_insert_clause ) select_statement
            {
            // PLSQL_DMLParser.g:588:5: ( all_key ( multi_table_element )+ | conditional_insert_clause )
            int alt119=2;
            int LA119_0 = input.LA(1);

            if ( (LA119_0==SQL92_RESERVED_ALL) ) {
                int LA119_1 = input.LA(2);

                if ( (LA119_1==SQL92_RESERVED_INTO) ) {
                    alt119=1;
                }
                else if ( (LA119_1==SQL92_RESERVED_WHEN) ) {
                    alt119=2;
                }
                else {
                    if (state.backtracking>0) {state.failed=true; return retval;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 119, 1, input);

                    throw nvae;

                }
            }
            else if ( (LA119_0==REGULAR_ID) && ((input.LT(1).getText().equalsIgnoreCase("first")))) {
                alt119=2;
            }
            else if ( (LA119_0==SQL92_RESERVED_WHEN) ) {
                alt119=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return retval;}
                NoViableAltException nvae =
                    new NoViableAltException("", 119, 0, input);

                throw nvae;

            }
            switch (alt119) {
                case 1 :
                    // PLSQL_DMLParser.g:588:10: all_key ( multi_table_element )+
                    {
                    pushFollow(FOLLOW_all_key_in_multi_table_insert5014);
                    all_key353=gPLSQLParser.all_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_all_key.add(all_key353.getTree());

                    // PLSQL_DMLParser.g:588:18: ( multi_table_element )+
                    int cnt118=0;
                    loop118:
                    do {
                        int alt118=2;
                        int LA118_0 = input.LA(1);

                        if ( (LA118_0==SQL92_RESERVED_INTO) ) {
                            alt118=1;
                        }


                        switch (alt118) {
                    	case 1 :
                    	    // PLSQL_DMLParser.g:588:18: multi_table_element
                    	    {
                    	    pushFollow(FOLLOW_multi_table_element_in_multi_table_insert5016);
                    	    multi_table_element354=multi_table_element();

                    	    state._fsp--;
                    	    if (state.failed) return retval;
                    	    if ( state.backtracking==0 ) stream_multi_table_element.add(multi_table_element354.getTree());

                    	    }
                    	    break;

                    	default :
                    	    if ( cnt118 >= 1 ) break loop118;
                    	    if (state.backtracking>0) {state.failed=true; return retval;}
                                EarlyExitException eee =
                                    new EarlyExitException(118, input);
                                throw eee;
                        }
                        cnt118++;
                    } while (true);


                    }
                    break;
                case 2 :
                    // PLSQL_DMLParser.g:589:10: conditional_insert_clause
                    {
                    pushFollow(FOLLOW_conditional_insert_clause_in_multi_table_insert5028);
                    conditional_insert_clause355=conditional_insert_clause();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_conditional_insert_clause.add(conditional_insert_clause355.getTree());

                    }
                    break;

            }


            pushFollow(FOLLOW_select_statement_in_multi_table_insert5044);
            select_statement356=select_statement();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_select_statement.add(select_statement356.getTree());

            // AST REWRITE
            // elements: conditional_insert_clause, select_statement, multi_table_element
            // token labels: 
            // rule labels: retval
            // token list labels: 
            // rule list labels: 
            // wildcard labels: 
            if ( state.backtracking==0 ) {

            retval.tree = root_0;
            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

            root_0 = (Object)adaptor.nil();
            // 592:9: -> ^( MULTI_TABLE_MODE select_statement ( multi_table_element )* ( conditional_insert_clause )? )
            {
                // PLSQL_DMLParser.g:592:12: ^( MULTI_TABLE_MODE select_statement ( multi_table_element )* ( conditional_insert_clause )? )
                {
                Object root_1 = (Object)adaptor.nil();
                root_1 = (Object)adaptor.becomeRoot(
                new MultiTableMode(MULTI_TABLE_MODE)
                , root_1);

                adaptor.addChild(root_1, stream_select_statement.nextTree());

                // PLSQL_DMLParser.g:592:64: ( multi_table_element )*
                while ( stream_multi_table_element.hasNext() ) {
                    adaptor.addChild(root_1, stream_multi_table_element.nextTree());

                }
                stream_multi_table_element.reset();

                // PLSQL_DMLParser.g:592:85: ( conditional_insert_clause )?
                if ( stream_conditional_insert_clause.hasNext() ) {
                    adaptor.addChild(root_1, stream_conditional_insert_clause.nextTree());

                }
                stream_conditional_insert_clause.reset();

                adaptor.addChild(root_0, root_1);
                }

            }


            retval.tree = root_0;
            }

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "multi_table_insert"


    public static class multi_table_element_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "multi_table_element"
    // PLSQL_DMLParser.g:595:1: multi_table_element : insert_into_clause ( values_clause )? ( error_logging_clause )? -> ^( TABLE_ELEMENT insert_into_clause ( values_clause )? ( error_logging_clause )? ) ;
    public final PLSQLParser_PLSQL_DMLParser.multi_table_element_return multi_table_element() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.multi_table_element_return retval = new PLSQLParser_PLSQL_DMLParser.multi_table_element_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        PLSQLParser_PLSQL_DMLParser.insert_into_clause_return insert_into_clause357 =null;

        PLSQLParser_PLSQL_DMLParser.values_clause_return values_clause358 =null;

        PLSQLParser_PLSQL_DMLParser.error_logging_clause_return error_logging_clause359 =null;


        RewriteRuleSubtreeStream stream_values_clause=new RewriteRuleSubtreeStream(adaptor,"rule values_clause");
        RewriteRuleSubtreeStream stream_insert_into_clause=new RewriteRuleSubtreeStream(adaptor,"rule insert_into_clause");
        RewriteRuleSubtreeStream stream_error_logging_clause=new RewriteRuleSubtreeStream(adaptor,"rule error_logging_clause");
        try {
            // PLSQL_DMLParser.g:596:5: ( insert_into_clause ( values_clause )? ( error_logging_clause )? -> ^( TABLE_ELEMENT insert_into_clause ( values_clause )? ( error_logging_clause )? ) )
            // PLSQL_DMLParser.g:596:10: insert_into_clause ( values_clause )? ( error_logging_clause )?
            {
            pushFollow(FOLLOW_insert_into_clause_in_multi_table_element5089);
            insert_into_clause357=insert_into_clause();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_insert_into_clause.add(insert_into_clause357.getTree());

            // PLSQL_DMLParser.g:596:29: ( values_clause )?
            int alt120=2;
            int LA120_0 = input.LA(1);

            if ( (LA120_0==SQL92_RESERVED_VALUES) ) {
                alt120=1;
            }
            switch (alt120) {
                case 1 :
                    // PLSQL_DMLParser.g:596:29: values_clause
                    {
                    pushFollow(FOLLOW_values_clause_in_multi_table_element5091);
                    values_clause358=values_clause();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_values_clause.add(values_clause358.getTree());

                    }
                    break;

            }


            // PLSQL_DMLParser.g:596:44: ( error_logging_clause )?
            int alt121=2;
            int LA121_0 = input.LA(1);

            if ( (LA121_0==REGULAR_ID) && ((input.LT(1).getText().equalsIgnoreCase("log")))) {
                alt121=1;
            }
            switch (alt121) {
                case 1 :
                    // PLSQL_DMLParser.g:596:44: error_logging_clause
                    {
                    pushFollow(FOLLOW_error_logging_clause_in_multi_table_element5094);
                    error_logging_clause359=error_logging_clause();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_error_logging_clause.add(error_logging_clause359.getTree());

                    }
                    break;

            }


            // AST REWRITE
            // elements: error_logging_clause, insert_into_clause, values_clause
            // token labels: 
            // rule labels: retval
            // token list labels: 
            // rule list labels: 
            // wildcard labels: 
            if ( state.backtracking==0 ) {

            retval.tree = root_0;
            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

            root_0 = (Object)adaptor.nil();
            // 597:9: -> ^( TABLE_ELEMENT insert_into_clause ( values_clause )? ( error_logging_clause )? )
            {
                // PLSQL_DMLParser.g:597:12: ^( TABLE_ELEMENT insert_into_clause ( values_clause )? ( error_logging_clause )? )
                {
                Object root_1 = (Object)adaptor.nil();
                root_1 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(TABLE_ELEMENT, "TABLE_ELEMENT")
                , root_1);

                adaptor.addChild(root_1, stream_insert_into_clause.nextTree());

                // PLSQL_DMLParser.g:597:47: ( values_clause )?
                if ( stream_values_clause.hasNext() ) {
                    adaptor.addChild(root_1, stream_values_clause.nextTree());

                }
                stream_values_clause.reset();

                // PLSQL_DMLParser.g:597:62: ( error_logging_clause )?
                if ( stream_error_logging_clause.hasNext() ) {
                    adaptor.addChild(root_1, stream_error_logging_clause.nextTree());

                }
                stream_error_logging_clause.reset();

                adaptor.addChild(root_0, root_1);
                }

            }


            retval.tree = root_0;
            }

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "multi_table_element"


    public static class conditional_insert_clause_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "conditional_insert_clause"
    // PLSQL_DMLParser.g:600:1: conditional_insert_clause : ( all_key | first_key )? ( conditional_insert_when_part )+ ( conditional_insert_else_part )? -> ^( CONDITIONAL_INSERT ( all_key )? ( first_key )? ( conditional_insert_when_part )+ ( conditional_insert_else_part )? ) ;
    public final PLSQLParser_PLSQL_DMLParser.conditional_insert_clause_return conditional_insert_clause() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.conditional_insert_clause_return retval = new PLSQLParser_PLSQL_DMLParser.conditional_insert_clause_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        PLSQLParser_PLSQLKeys.all_key_return all_key360 =null;

        PLSQLParser_PLSQLKeys.first_key_return first_key361 =null;

        PLSQLParser_PLSQL_DMLParser.conditional_insert_when_part_return conditional_insert_when_part362 =null;

        PLSQLParser_PLSQL_DMLParser.conditional_insert_else_part_return conditional_insert_else_part363 =null;


        RewriteRuleSubtreeStream stream_all_key=new RewriteRuleSubtreeStream(adaptor,"rule all_key");
        RewriteRuleSubtreeStream stream_conditional_insert_when_part=new RewriteRuleSubtreeStream(adaptor,"rule conditional_insert_when_part");
        RewriteRuleSubtreeStream stream_conditional_insert_else_part=new RewriteRuleSubtreeStream(adaptor,"rule conditional_insert_else_part");
        RewriteRuleSubtreeStream stream_first_key=new RewriteRuleSubtreeStream(adaptor,"rule first_key");
        try {
            // PLSQL_DMLParser.g:601:5: ( ( all_key | first_key )? ( conditional_insert_when_part )+ ( conditional_insert_else_part )? -> ^( CONDITIONAL_INSERT ( all_key )? ( first_key )? ( conditional_insert_when_part )+ ( conditional_insert_else_part )? ) )
            // PLSQL_DMLParser.g:601:10: ( all_key | first_key )? ( conditional_insert_when_part )+ ( conditional_insert_else_part )?
            {
            // PLSQL_DMLParser.g:601:10: ( all_key | first_key )?
            int alt122=3;
            int LA122_0 = input.LA(1);

            if ( (LA122_0==SQL92_RESERVED_ALL) ) {
                alt122=1;
            }
            else if ( (LA122_0==REGULAR_ID) && ((input.LT(1).getText().equalsIgnoreCase("first")))) {
                alt122=2;
            }
            switch (alt122) {
                case 1 :
                    // PLSQL_DMLParser.g:601:11: all_key
                    {
                    pushFollow(FOLLOW_all_key_in_conditional_insert_clause5138);
                    all_key360=gPLSQLParser.all_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_all_key.add(all_key360.getTree());

                    }
                    break;
                case 2 :
                    // PLSQL_DMLParser.g:601:19: first_key
                    {
                    pushFollow(FOLLOW_first_key_in_conditional_insert_clause5140);
                    first_key361=gPLSQLParser.first_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_first_key.add(first_key361.getTree());

                    }
                    break;

            }


            // PLSQL_DMLParser.g:602:9: ( conditional_insert_when_part )+
            int cnt123=0;
            loop123:
            do {
                int alt123=2;
                int LA123_0 = input.LA(1);

                if ( (LA123_0==SQL92_RESERVED_WHEN) ) {
                    alt123=1;
                }


                switch (alt123) {
            	case 1 :
            	    // PLSQL_DMLParser.g:602:9: conditional_insert_when_part
            	    {
            	    pushFollow(FOLLOW_conditional_insert_when_part_in_conditional_insert_clause5152);
            	    conditional_insert_when_part362=conditional_insert_when_part();

            	    state._fsp--;
            	    if (state.failed) return retval;
            	    if ( state.backtracking==0 ) stream_conditional_insert_when_part.add(conditional_insert_when_part362.getTree());

            	    }
            	    break;

            	default :
            	    if ( cnt123 >= 1 ) break loop123;
            	    if (state.backtracking>0) {state.failed=true; return retval;}
                        EarlyExitException eee =
                            new EarlyExitException(123, input);
                        throw eee;
                }
                cnt123++;
            } while (true);


            // PLSQL_DMLParser.g:602:39: ( conditional_insert_else_part )?
            int alt124=2;
            int LA124_0 = input.LA(1);

            if ( (LA124_0==SQL92_RESERVED_ELSE) ) {
                alt124=1;
            }
            switch (alt124) {
                case 1 :
                    // PLSQL_DMLParser.g:602:39: conditional_insert_else_part
                    {
                    pushFollow(FOLLOW_conditional_insert_else_part_in_conditional_insert_clause5155);
                    conditional_insert_else_part363=conditional_insert_else_part();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_conditional_insert_else_part.add(conditional_insert_else_part363.getTree());

                    }
                    break;

            }


            // AST REWRITE
            // elements: conditional_insert_else_part, conditional_insert_when_part, first_key, all_key
            // token labels: 
            // rule labels: retval
            // token list labels: 
            // rule list labels: 
            // wildcard labels: 
            if ( state.backtracking==0 ) {

            retval.tree = root_0;
            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

            root_0 = (Object)adaptor.nil();
            // 603:9: -> ^( CONDITIONAL_INSERT ( all_key )? ( first_key )? ( conditional_insert_when_part )+ ( conditional_insert_else_part )? )
            {
                // PLSQL_DMLParser.g:603:12: ^( CONDITIONAL_INSERT ( all_key )? ( first_key )? ( conditional_insert_when_part )+ ( conditional_insert_else_part )? )
                {
                Object root_1 = (Object)adaptor.nil();
                root_1 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(CONDITIONAL_INSERT, "CONDITIONAL_INSERT")
                , root_1);

                // PLSQL_DMLParser.g:603:33: ( all_key )?
                if ( stream_all_key.hasNext() ) {
                    adaptor.addChild(root_1, stream_all_key.nextTree());

                }
                stream_all_key.reset();

                // PLSQL_DMLParser.g:603:42: ( first_key )?
                if ( stream_first_key.hasNext() ) {
                    adaptor.addChild(root_1, stream_first_key.nextTree());

                }
                stream_first_key.reset();

                if ( !(stream_conditional_insert_when_part.hasNext()) ) {
                    throw new RewriteEarlyExitException();
                }
                while ( stream_conditional_insert_when_part.hasNext() ) {
                    adaptor.addChild(root_1, stream_conditional_insert_when_part.nextTree());

                }
                stream_conditional_insert_when_part.reset();

                // PLSQL_DMLParser.g:603:83: ( conditional_insert_else_part )?
                if ( stream_conditional_insert_else_part.hasNext() ) {
                    adaptor.addChild(root_1, stream_conditional_insert_else_part.nextTree());

                }
                stream_conditional_insert_else_part.reset();

                adaptor.addChild(root_0, root_1);
                }

            }


            retval.tree = root_0;
            }

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "conditional_insert_clause"


    public static class conditional_insert_when_part_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "conditional_insert_when_part"
    // PLSQL_DMLParser.g:606:1: conditional_insert_when_part : when_key condition then_key ( multi_table_element )+ -> ^( when_key ^( LOGIC_EXPR condition ) ( multi_table_element )+ ) ;
    public final PLSQLParser_PLSQL_DMLParser.conditional_insert_when_part_return conditional_insert_when_part() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.conditional_insert_when_part_return retval = new PLSQLParser_PLSQL_DMLParser.conditional_insert_when_part_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        PLSQLParser_PLSQLKeys.when_key_return when_key364 =null;

        PLSQLParser_PLSQL_DMLParser.condition_return condition365 =null;

        PLSQLParser_PLSQLKeys.then_key_return then_key366 =null;

        PLSQLParser_PLSQL_DMLParser.multi_table_element_return multi_table_element367 =null;


        RewriteRuleSubtreeStream stream_then_key=new RewriteRuleSubtreeStream(adaptor,"rule then_key");
        RewriteRuleSubtreeStream stream_condition=new RewriteRuleSubtreeStream(adaptor,"rule condition");
        RewriteRuleSubtreeStream stream_multi_table_element=new RewriteRuleSubtreeStream(adaptor,"rule multi_table_element");
        RewriteRuleSubtreeStream stream_when_key=new RewriteRuleSubtreeStream(adaptor,"rule when_key");
        try {
            // PLSQL_DMLParser.g:607:5: ( when_key condition then_key ( multi_table_element )+ -> ^( when_key ^( LOGIC_EXPR condition ) ( multi_table_element )+ ) )
            // PLSQL_DMLParser.g:607:10: when_key condition then_key ( multi_table_element )+
            {
            pushFollow(FOLLOW_when_key_in_conditional_insert_when_part5203);
            when_key364=gPLSQLParser.when_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_when_key.add(when_key364.getTree());

            pushFollow(FOLLOW_condition_in_conditional_insert_when_part5205);
            condition365=condition();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_condition.add(condition365.getTree());

            pushFollow(FOLLOW_then_key_in_conditional_insert_when_part5207);
            then_key366=gPLSQLParser.then_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_then_key.add(then_key366.getTree());

            // PLSQL_DMLParser.g:607:38: ( multi_table_element )+
            int cnt125=0;
            loop125:
            do {
                int alt125=2;
                int LA125_0 = input.LA(1);

                if ( (LA125_0==SQL92_RESERVED_INTO) ) {
                    alt125=1;
                }


                switch (alt125) {
            	case 1 :
            	    // PLSQL_DMLParser.g:607:38: multi_table_element
            	    {
            	    pushFollow(FOLLOW_multi_table_element_in_conditional_insert_when_part5209);
            	    multi_table_element367=multi_table_element();

            	    state._fsp--;
            	    if (state.failed) return retval;
            	    if ( state.backtracking==0 ) stream_multi_table_element.add(multi_table_element367.getTree());

            	    }
            	    break;

            	default :
            	    if ( cnt125 >= 1 ) break loop125;
            	    if (state.backtracking>0) {state.failed=true; return retval;}
                        EarlyExitException eee =
                            new EarlyExitException(125, input);
                        throw eee;
                }
                cnt125++;
            } while (true);


            // AST REWRITE
            // elements: when_key, multi_table_element, condition
            // token labels: 
            // rule labels: retval
            // token list labels: 
            // rule list labels: 
            // wildcard labels: 
            if ( state.backtracking==0 ) {

            retval.tree = root_0;
            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

            root_0 = (Object)adaptor.nil();
            // 608:9: -> ^( when_key ^( LOGIC_EXPR condition ) ( multi_table_element )+ )
            {
                // PLSQL_DMLParser.g:608:12: ^( when_key ^( LOGIC_EXPR condition ) ( multi_table_element )+ )
                {
                Object root_1 = (Object)adaptor.nil();
                root_1 = (Object)adaptor.becomeRoot(stream_when_key.nextNode(), root_1);

                // PLSQL_DMLParser.g:608:23: ^( LOGIC_EXPR condition )
                {
                Object root_2 = (Object)adaptor.nil();
                root_2 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(LOGIC_EXPR, "LOGIC_EXPR")
                , root_2);

                adaptor.addChild(root_2, stream_condition.nextTree());

                adaptor.addChild(root_1, root_2);
                }

                if ( !(stream_multi_table_element.hasNext()) ) {
                    throw new RewriteEarlyExitException();
                }
                while ( stream_multi_table_element.hasNext() ) {
                    adaptor.addChild(root_1, stream_multi_table_element.nextTree());

                }
                stream_multi_table_element.reset();

                adaptor.addChild(root_0, root_1);
                }

            }


            retval.tree = root_0;
            }

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "conditional_insert_when_part"


    public static class conditional_insert_else_part_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "conditional_insert_else_part"
    // PLSQL_DMLParser.g:611:1: conditional_insert_else_part : else_key ^ ( multi_table_element )+ ;
    public final PLSQLParser_PLSQL_DMLParser.conditional_insert_else_part_return conditional_insert_else_part() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.conditional_insert_else_part_return retval = new PLSQLParser_PLSQL_DMLParser.conditional_insert_else_part_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        PLSQLParser_PLSQLKeys.else_key_return else_key368 =null;

        PLSQLParser_PLSQL_DMLParser.multi_table_element_return multi_table_element369 =null;



        try {
            // PLSQL_DMLParser.g:612:5: ( else_key ^ ( multi_table_element )+ )
            // PLSQL_DMLParser.g:612:10: else_key ^ ( multi_table_element )+
            {
            root_0 = (Object)adaptor.nil();


            pushFollow(FOLLOW_else_key_in_conditional_insert_else_part5253);
            else_key368=gPLSQLParser.else_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) root_0 = (Object)adaptor.becomeRoot(else_key368.getTree(), root_0);

            // PLSQL_DMLParser.g:612:20: ( multi_table_element )+
            int cnt126=0;
            loop126:
            do {
                int alt126=2;
                int LA126_0 = input.LA(1);

                if ( (LA126_0==SQL92_RESERVED_INTO) ) {
                    alt126=1;
                }


                switch (alt126) {
            	case 1 :
            	    // PLSQL_DMLParser.g:612:20: multi_table_element
            	    {
            	    pushFollow(FOLLOW_multi_table_element_in_conditional_insert_else_part5256);
            	    multi_table_element369=multi_table_element();

            	    state._fsp--;
            	    if (state.failed) return retval;
            	    if ( state.backtracking==0 ) adaptor.addChild(root_0, multi_table_element369.getTree());

            	    }
            	    break;

            	default :
            	    if ( cnt126 >= 1 ) break loop126;
            	    if (state.backtracking>0) {state.failed=true; return retval;}
                        EarlyExitException eee =
                            new EarlyExitException(126, input);
                        throw eee;
                }
                cnt126++;
            } while (true);


            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "conditional_insert_else_part"


    public static class insert_into_clause_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "insert_into_clause"
    // PLSQL_DMLParser.g:615:1: insert_into_clause : into_key general_table_ref ( LEFT_PAREN column_name ( COMMA column_name )* RIGHT_PAREN )? -> ^( into_key general_table_ref ^( COLUMNS ( column_name )* ) ) ;
    public final PLSQLParser_PLSQL_DMLParser.insert_into_clause_return insert_into_clause() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.insert_into_clause_return retval = new PLSQLParser_PLSQL_DMLParser.insert_into_clause_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token LEFT_PAREN372=null;
        Token COMMA374=null;
        Token RIGHT_PAREN376=null;
        PLSQLParser_PLSQLKeys.into_key_return into_key370 =null;

        PLSQLParser_PLSQL_DMLParser.general_table_ref_return general_table_ref371 =null;

        PLSQLParser_PLSQLCommons.column_name_return column_name373 =null;

        PLSQLParser_PLSQLCommons.column_name_return column_name375 =null;


        Object LEFT_PAREN372_tree=null;
        Object COMMA374_tree=null;
        Object RIGHT_PAREN376_tree=null;
        RewriteRuleTokenStream stream_LEFT_PAREN=new RewriteRuleTokenStream(adaptor,"token LEFT_PAREN");
        RewriteRuleTokenStream stream_RIGHT_PAREN=new RewriteRuleTokenStream(adaptor,"token RIGHT_PAREN");
        RewriteRuleTokenStream stream_COMMA=new RewriteRuleTokenStream(adaptor,"token COMMA");
        RewriteRuleSubtreeStream stream_general_table_ref=new RewriteRuleSubtreeStream(adaptor,"rule general_table_ref");
        RewriteRuleSubtreeStream stream_into_key=new RewriteRuleSubtreeStream(adaptor,"rule into_key");
        RewriteRuleSubtreeStream stream_column_name=new RewriteRuleSubtreeStream(adaptor,"rule column_name");
        try {
            // PLSQL_DMLParser.g:616:5: ( into_key general_table_ref ( LEFT_PAREN column_name ( COMMA column_name )* RIGHT_PAREN )? -> ^( into_key general_table_ref ^( COLUMNS ( column_name )* ) ) )
            // PLSQL_DMLParser.g:616:10: into_key general_table_ref ( LEFT_PAREN column_name ( COMMA column_name )* RIGHT_PAREN )?
            {
            pushFollow(FOLLOW_into_key_in_insert_into_clause5277);
            into_key370=gPLSQLParser.into_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_into_key.add(into_key370.getTree());

            pushFollow(FOLLOW_general_table_ref_in_insert_into_clause5279);
            general_table_ref371=general_table_ref();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_general_table_ref.add(general_table_ref371.getTree());

            // PLSQL_DMLParser.g:617:9: ( LEFT_PAREN column_name ( COMMA column_name )* RIGHT_PAREN )?
            int alt128=2;
            int LA128_0 = input.LA(1);

            if ( (LA128_0==LEFT_PAREN) ) {
                int LA128_1 = input.LA(2);

                if ( (LA128_1==DELIMITED_ID||LA128_1==INTRODUCER||LA128_1==REGULAR_ID) ) {
                    alt128=1;
                }
            }
            switch (alt128) {
                case 1 :
                    // PLSQL_DMLParser.g:617:10: LEFT_PAREN column_name ( COMMA column_name )* RIGHT_PAREN
                    {
                    LEFT_PAREN372=(Token)match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_insert_into_clause5291); if (state.failed) return retval; 
                    if ( state.backtracking==0 ) stream_LEFT_PAREN.add(LEFT_PAREN372);


                    pushFollow(FOLLOW_column_name_in_insert_into_clause5293);
                    column_name373=gPLSQLParser.column_name();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_column_name.add(column_name373.getTree());

                    // PLSQL_DMLParser.g:617:33: ( COMMA column_name )*
                    loop127:
                    do {
                        int alt127=2;
                        int LA127_0 = input.LA(1);

                        if ( (LA127_0==COMMA) ) {
                            alt127=1;
                        }


                        switch (alt127) {
                    	case 1 :
                    	    // PLSQL_DMLParser.g:617:34: COMMA column_name
                    	    {
                    	    COMMA374=(Token)match(input,COMMA,FOLLOW_COMMA_in_insert_into_clause5296); if (state.failed) return retval; 
                    	    if ( state.backtracking==0 ) stream_COMMA.add(COMMA374);


                    	    pushFollow(FOLLOW_column_name_in_insert_into_clause5298);
                    	    column_name375=gPLSQLParser.column_name();

                    	    state._fsp--;
                    	    if (state.failed) return retval;
                    	    if ( state.backtracking==0 ) stream_column_name.add(column_name375.getTree());

                    	    }
                    	    break;

                    	default :
                    	    break loop127;
                        }
                    } while (true);


                    RIGHT_PAREN376=(Token)match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_insert_into_clause5302); if (state.failed) return retval; 
                    if ( state.backtracking==0 ) stream_RIGHT_PAREN.add(RIGHT_PAREN376);


                    }
                    break;

            }


            // AST REWRITE
            // elements: into_key, column_name, general_table_ref
            // token labels: 
            // rule labels: retval
            // token list labels: 
            // rule list labels: 
            // wildcard labels: 
            if ( state.backtracking==0 ) {

            retval.tree = root_0;
            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

            root_0 = (Object)adaptor.nil();
            // 618:9: -> ^( into_key general_table_ref ^( COLUMNS ( column_name )* ) )
            {
                // PLSQL_DMLParser.g:618:12: ^( into_key general_table_ref ^( COLUMNS ( column_name )* ) )
                {
                Object root_1 = (Object)adaptor.nil();
                root_1 = (Object)adaptor.becomeRoot(stream_into_key.nextNode(), root_1);

                adaptor.addChild(root_1, stream_general_table_ref.nextTree());

                // PLSQL_DMLParser.g:618:41: ^( COLUMNS ( column_name )* )
                {
                Object root_2 = (Object)adaptor.nil();
                root_2 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(COLUMNS, "COLUMNS")
                , root_2);

                // PLSQL_DMLParser.g:618:51: ( column_name )*
                while ( stream_column_name.hasNext() ) {
                    adaptor.addChild(root_2, stream_column_name.nextTree());

                }
                stream_column_name.reset();

                adaptor.addChild(root_1, root_2);
                }

                adaptor.addChild(root_0, root_1);
                }

            }


            retval.tree = root_0;
            }

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "insert_into_clause"


    public static class values_clause_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "values_clause"
    // PLSQL_DMLParser.g:621:1: values_clause : values_key ^ expression_list ;
    public final PLSQLParser_PLSQL_DMLParser.values_clause_return values_clause() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.values_clause_return retval = new PLSQLParser_PLSQL_DMLParser.values_clause_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        PLSQLParser_PLSQLKeys.values_key_return values_key377 =null;

        PLSQLParser_PLSQL_DMLParser.expression_list_return expression_list378 =null;



        try {
            // PLSQL_DMLParser.g:622:5: ( values_key ^ expression_list )
            // PLSQL_DMLParser.g:622:10: values_key ^ expression_list
            {
            root_0 = (Object)adaptor.nil();


            pushFollow(FOLLOW_values_key_in_values_clause5347);
            values_key377=gPLSQLParser.values_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) root_0 = (Object)adaptor.becomeRoot(values_key377.getTree(), root_0);

            pushFollow(FOLLOW_expression_list_in_values_clause5350);
            expression_list378=expression_list();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) adaptor.addChild(root_0, expression_list378.getTree());

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "values_clause"


    public static class merge_statement_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "merge_statement"
    // PLSQL_DMLParser.g:626:1: merge_statement : merge_key into_key tableview_name ( alias )? using_key selected_tableview on_key LEFT_PAREN condition RIGHT_PAREN ( merge_update_clause )? ( merge_insert_clause )? ( error_logging_clause )? -> ^( merge_key ( alias )? tableview_name ^( using_key selected_tableview ^( LOGIC_EXPR condition ) ) ( merge_update_clause )? ( merge_insert_clause )? ( error_logging_clause )? ) ;
    public final PLSQLParser_PLSQL_DMLParser.merge_statement_return merge_statement() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.merge_statement_return retval = new PLSQLParser_PLSQL_DMLParser.merge_statement_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token LEFT_PAREN386=null;
        Token RIGHT_PAREN388=null;
        PLSQLParser_PLSQLKeys.merge_key_return merge_key379 =null;

        PLSQLParser_PLSQLKeys.into_key_return into_key380 =null;

        PLSQLParser_PLSQLCommons.tableview_name_return tableview_name381 =null;

        PLSQLParser_PLSQLCommons.alias_return alias382 =null;

        PLSQLParser_PLSQLKeys.using_key_return using_key383 =null;

        PLSQLParser_PLSQL_DMLParser.selected_tableview_return selected_tableview384 =null;

        PLSQLParser_PLSQLKeys.on_key_return on_key385 =null;

        PLSQLParser_PLSQL_DMLParser.condition_return condition387 =null;

        PLSQLParser_PLSQL_DMLParser.merge_update_clause_return merge_update_clause389 =null;

        PLSQLParser_PLSQL_DMLParser.merge_insert_clause_return merge_insert_clause390 =null;

        PLSQLParser_PLSQL_DMLParser.error_logging_clause_return error_logging_clause391 =null;


        Object LEFT_PAREN386_tree=null;
        Object RIGHT_PAREN388_tree=null;
        RewriteRuleTokenStream stream_LEFT_PAREN=new RewriteRuleTokenStream(adaptor,"token LEFT_PAREN");
        RewriteRuleTokenStream stream_RIGHT_PAREN=new RewriteRuleTokenStream(adaptor,"token RIGHT_PAREN");
        RewriteRuleSubtreeStream stream_using_key=new RewriteRuleSubtreeStream(adaptor,"rule using_key");
        RewriteRuleSubtreeStream stream_merge_insert_clause=new RewriteRuleSubtreeStream(adaptor,"rule merge_insert_clause");
        RewriteRuleSubtreeStream stream_into_key=new RewriteRuleSubtreeStream(adaptor,"rule into_key");
        RewriteRuleSubtreeStream stream_merge_key=new RewriteRuleSubtreeStream(adaptor,"rule merge_key");
        RewriteRuleSubtreeStream stream_merge_update_clause=new RewriteRuleSubtreeStream(adaptor,"rule merge_update_clause");
        RewriteRuleSubtreeStream stream_error_logging_clause=new RewriteRuleSubtreeStream(adaptor,"rule error_logging_clause");
        RewriteRuleSubtreeStream stream_alias=new RewriteRuleSubtreeStream(adaptor,"rule alias");
        RewriteRuleSubtreeStream stream_condition=new RewriteRuleSubtreeStream(adaptor,"rule condition");
        RewriteRuleSubtreeStream stream_selected_tableview=new RewriteRuleSubtreeStream(adaptor,"rule selected_tableview");
        RewriteRuleSubtreeStream stream_on_key=new RewriteRuleSubtreeStream(adaptor,"rule on_key");
        RewriteRuleSubtreeStream stream_tableview_name=new RewriteRuleSubtreeStream(adaptor,"rule tableview_name");
        try {
            // PLSQL_DMLParser.g:627:5: ( merge_key into_key tableview_name ( alias )? using_key selected_tableview on_key LEFT_PAREN condition RIGHT_PAREN ( merge_update_clause )? ( merge_insert_clause )? ( error_logging_clause )? -> ^( merge_key ( alias )? tableview_name ^( using_key selected_tableview ^( LOGIC_EXPR condition ) ) ( merge_update_clause )? ( merge_insert_clause )? ( error_logging_clause )? ) )
            // PLSQL_DMLParser.g:627:10: merge_key into_key tableview_name ( alias )? using_key selected_tableview on_key LEFT_PAREN condition RIGHT_PAREN ( merge_update_clause )? ( merge_insert_clause )? ( error_logging_clause )?
            {
            pushFollow(FOLLOW_merge_key_in_merge_statement5371);
            merge_key379=gPLSQLParser.merge_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_merge_key.add(merge_key379.getTree());

            pushFollow(FOLLOW_into_key_in_merge_statement5373);
            into_key380=gPLSQLParser.into_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_into_key.add(into_key380.getTree());

            pushFollow(FOLLOW_tableview_name_in_merge_statement5375);
            tableview_name381=gPLSQLParser.tableview_name();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_tableview_name.add(tableview_name381.getTree());

            // PLSQL_DMLParser.g:627:44: ( alias )?
            int alt129=2;
            int LA129_0 = input.LA(1);

            if ( (LA129_0==CHAR_STRING||LA129_0==DELIMITED_ID||LA129_0==INTRODUCER||LA129_0==REGULAR_ID||LA129_0==SQL92_RESERVED_AS) ) {
                alt129=1;
            }
            switch (alt129) {
                case 1 :
                    // PLSQL_DMLParser.g:627:44: alias
                    {
                    pushFollow(FOLLOW_alias_in_merge_statement5377);
                    alias382=gPLSQLParser.alias();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_alias.add(alias382.getTree());

                    }
                    break;

            }


            pushFollow(FOLLOW_using_key_in_merge_statement5388);
            using_key383=gPLSQLParser.using_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_using_key.add(using_key383.getTree());

            pushFollow(FOLLOW_selected_tableview_in_merge_statement5390);
            selected_tableview384=selected_tableview();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_selected_tableview.add(selected_tableview384.getTree());

            pushFollow(FOLLOW_on_key_in_merge_statement5392);
            on_key385=gPLSQLParser.on_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_on_key.add(on_key385.getTree());

            LEFT_PAREN386=(Token)match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_merge_statement5394); if (state.failed) return retval; 
            if ( state.backtracking==0 ) stream_LEFT_PAREN.add(LEFT_PAREN386);


            pushFollow(FOLLOW_condition_in_merge_statement5396);
            condition387=condition();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_condition.add(condition387.getTree());

            RIGHT_PAREN388=(Token)match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_merge_statement5398); if (state.failed) return retval; 
            if ( state.backtracking==0 ) stream_RIGHT_PAREN.add(RIGHT_PAREN388);


            // PLSQL_DMLParser.g:629:9: ( merge_update_clause )?
            int alt130=2;
            alt130 = dfa130.predict(input);
            switch (alt130) {
                case 1 :
                    // PLSQL_DMLParser.g:629:9: merge_update_clause
                    {
                    pushFollow(FOLLOW_merge_update_clause_in_merge_statement5408);
                    merge_update_clause389=merge_update_clause();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_merge_update_clause.add(merge_update_clause389.getTree());

                    }
                    break;

            }


            // PLSQL_DMLParser.g:629:30: ( merge_insert_clause )?
            int alt131=2;
            int LA131_0 = input.LA(1);

            if ( (LA131_0==SQL92_RESERVED_WHEN) ) {
                int LA131_1 = input.LA(2);

                if ( (LA131_1==SQL92_RESERVED_NOT) ) {
                    int LA131_3 = input.LA(3);

                    if ( (LA131_3==REGULAR_ID) ) {
                        int LA131_4 = input.LA(4);

                        if ( (LA131_4==SQL92_RESERVED_THEN) ) {
                            int LA131_5 = input.LA(5);

                            if ( (LA131_5==SQL92_RESERVED_INSERT) ) {
                                int LA131_6 = input.LA(6);

                                if ( (LA131_6==LEFT_PAREN||LA131_6==SQL92_RESERVED_VALUES) ) {
                                    alt131=1;
                                }
                            }
                        }
                    }
                }
            }
            switch (alt131) {
                case 1 :
                    // PLSQL_DMLParser.g:629:30: merge_insert_clause
                    {
                    pushFollow(FOLLOW_merge_insert_clause_in_merge_statement5411);
                    merge_insert_clause390=merge_insert_clause();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_merge_insert_clause.add(merge_insert_clause390.getTree());

                    }
                    break;

            }


            // PLSQL_DMLParser.g:629:51: ( error_logging_clause )?
            int alt132=2;
            int LA132_0 = input.LA(1);

            if ( (LA132_0==REGULAR_ID) ) {
                int LA132_1 = input.LA(2);

                if ( (LA132_1==REGULAR_ID) && ((input.LT(1).getText().equalsIgnoreCase("log")))) {
                    alt132=1;
                }
            }
            switch (alt132) {
                case 1 :
                    // PLSQL_DMLParser.g:629:51: error_logging_clause
                    {
                    pushFollow(FOLLOW_error_logging_clause_in_merge_statement5414);
                    error_logging_clause391=error_logging_clause();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_error_logging_clause.add(error_logging_clause391.getTree());

                    }
                    break;

            }


            // AST REWRITE
            // elements: merge_update_clause, selected_tableview, merge_insert_clause, alias, tableview_name, using_key, condition, merge_key, error_logging_clause
            // token labels: 
            // rule labels: retval
            // token list labels: 
            // rule list labels: 
            // wildcard labels: 
            if ( state.backtracking==0 ) {

            retval.tree = root_0;
            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

            root_0 = (Object)adaptor.nil();
            // 630:9: -> ^( merge_key ( alias )? tableview_name ^( using_key selected_tableview ^( LOGIC_EXPR condition ) ) ( merge_update_clause )? ( merge_insert_clause )? ( error_logging_clause )? )
            {
                // PLSQL_DMLParser.g:630:12: ^( merge_key ( alias )? tableview_name ^( using_key selected_tableview ^( LOGIC_EXPR condition ) ) ( merge_update_clause )? ( merge_insert_clause )? ( error_logging_clause )? )
                {
                Object root_1 = (Object)adaptor.nil();
                root_1 = (Object)adaptor.becomeRoot(stream_merge_key.nextNode(), root_1);

                // PLSQL_DMLParser.g:630:24: ( alias )?
                if ( stream_alias.hasNext() ) {
                    adaptor.addChild(root_1, stream_alias.nextTree());

                }
                stream_alias.reset();

                adaptor.addChild(root_1, stream_tableview_name.nextTree());

                // PLSQL_DMLParser.g:630:46: ^( using_key selected_tableview ^( LOGIC_EXPR condition ) )
                {
                Object root_2 = (Object)adaptor.nil();
                root_2 = (Object)adaptor.becomeRoot(stream_using_key.nextNode(), root_2);

                adaptor.addChild(root_2, stream_selected_tableview.nextTree());

                // PLSQL_DMLParser.g:630:77: ^( LOGIC_EXPR condition )
                {
                Object root_3 = (Object)adaptor.nil();
                root_3 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(LOGIC_EXPR, "LOGIC_EXPR")
                , root_3);

                adaptor.addChild(root_3, stream_condition.nextTree());

                adaptor.addChild(root_2, root_3);
                }

                adaptor.addChild(root_1, root_2);
                }

                // PLSQL_DMLParser.g:631:18: ( merge_update_clause )?
                if ( stream_merge_update_clause.hasNext() ) {
                    adaptor.addChild(root_1, stream_merge_update_clause.nextTree());

                }
                stream_merge_update_clause.reset();

                // PLSQL_DMLParser.g:631:39: ( merge_insert_clause )?
                if ( stream_merge_insert_clause.hasNext() ) {
                    adaptor.addChild(root_1, stream_merge_insert_clause.nextTree());

                }
                stream_merge_insert_clause.reset();

                // PLSQL_DMLParser.g:631:60: ( error_logging_clause )?
                if ( stream_error_logging_clause.hasNext() ) {
                    adaptor.addChild(root_1, stream_error_logging_clause.nextTree());

                }
                stream_error_logging_clause.reset();

                adaptor.addChild(root_0, root_1);
                }

            }


            retval.tree = root_0;
            }

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "merge_statement"


    public static class merge_update_clause_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "merge_update_clause"
    // PLSQL_DMLParser.g:636:1: merge_update_clause : when_key matched_key then_key update_key set_key merge_element ( COMMA merge_element )* ( where_clause )? ( merge_update_delete_part )? -> ^( MERGE_UPDATE ( merge_element )+ ( where_clause )? ( merge_update_delete_part )? ) ;
    public final PLSQLParser_PLSQL_DMLParser.merge_update_clause_return merge_update_clause() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.merge_update_clause_return retval = new PLSQLParser_PLSQL_DMLParser.merge_update_clause_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token COMMA398=null;
        PLSQLParser_PLSQLKeys.when_key_return when_key392 =null;

        PLSQLParser_PLSQLKeys.matched_key_return matched_key393 =null;

        PLSQLParser_PLSQLKeys.then_key_return then_key394 =null;

        PLSQLParser_PLSQLKeys.update_key_return update_key395 =null;

        PLSQLParser_PLSQLKeys.set_key_return set_key396 =null;

        PLSQLParser_PLSQL_DMLParser.merge_element_return merge_element397 =null;

        PLSQLParser_PLSQL_DMLParser.merge_element_return merge_element399 =null;

        PLSQLParser_PLSQLCommons.where_clause_return where_clause400 =null;

        PLSQLParser_PLSQL_DMLParser.merge_update_delete_part_return merge_update_delete_part401 =null;


        Object COMMA398_tree=null;
        RewriteRuleTokenStream stream_COMMA=new RewriteRuleTokenStream(adaptor,"token COMMA");
        RewriteRuleSubtreeStream stream_then_key=new RewriteRuleSubtreeStream(adaptor,"rule then_key");
        RewriteRuleSubtreeStream stream_merge_update_delete_part=new RewriteRuleSubtreeStream(adaptor,"rule merge_update_delete_part");
        RewriteRuleSubtreeStream stream_merge_element=new RewriteRuleSubtreeStream(adaptor,"rule merge_element");
        RewriteRuleSubtreeStream stream_where_clause=new RewriteRuleSubtreeStream(adaptor,"rule where_clause");
        RewriteRuleSubtreeStream stream_set_key=new RewriteRuleSubtreeStream(adaptor,"rule set_key");
        RewriteRuleSubtreeStream stream_update_key=new RewriteRuleSubtreeStream(adaptor,"rule update_key");
        RewriteRuleSubtreeStream stream_when_key=new RewriteRuleSubtreeStream(adaptor,"rule when_key");
        RewriteRuleSubtreeStream stream_matched_key=new RewriteRuleSubtreeStream(adaptor,"rule matched_key");
        try {
            // PLSQL_DMLParser.g:637:5: ( when_key matched_key then_key update_key set_key merge_element ( COMMA merge_element )* ( where_clause )? ( merge_update_delete_part )? -> ^( MERGE_UPDATE ( merge_element )+ ( where_clause )? ( merge_update_delete_part )? ) )
            // PLSQL_DMLParser.g:637:10: when_key matched_key then_key update_key set_key merge_element ( COMMA merge_element )* ( where_clause )? ( merge_update_delete_part )?
            {
            pushFollow(FOLLOW_when_key_in_merge_update_clause5494);
            when_key392=gPLSQLParser.when_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_when_key.add(when_key392.getTree());

            pushFollow(FOLLOW_matched_key_in_merge_update_clause5496);
            matched_key393=gPLSQLParser.matched_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_matched_key.add(matched_key393.getTree());

            pushFollow(FOLLOW_then_key_in_merge_update_clause5498);
            then_key394=gPLSQLParser.then_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_then_key.add(then_key394.getTree());

            pushFollow(FOLLOW_update_key_in_merge_update_clause5500);
            update_key395=gPLSQLParser.update_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_update_key.add(update_key395.getTree());

            pushFollow(FOLLOW_set_key_in_merge_update_clause5502);
            set_key396=gPLSQLParser.set_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_set_key.add(set_key396.getTree());

            pushFollow(FOLLOW_merge_element_in_merge_update_clause5513);
            merge_element397=merge_element();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_merge_element.add(merge_element397.getTree());

            // PLSQL_DMLParser.g:638:23: ( COMMA merge_element )*
            loop133:
            do {
                int alt133=2;
                int LA133_0 = input.LA(1);

                if ( (LA133_0==COMMA) ) {
                    alt133=1;
                }


                switch (alt133) {
            	case 1 :
            	    // PLSQL_DMLParser.g:638:24: COMMA merge_element
            	    {
            	    COMMA398=(Token)match(input,COMMA,FOLLOW_COMMA_in_merge_update_clause5516); if (state.failed) return retval; 
            	    if ( state.backtracking==0 ) stream_COMMA.add(COMMA398);


            	    pushFollow(FOLLOW_merge_element_in_merge_update_clause5518);
            	    merge_element399=merge_element();

            	    state._fsp--;
            	    if (state.failed) return retval;
            	    if ( state.backtracking==0 ) stream_merge_element.add(merge_element399.getTree());

            	    }
            	    break;

            	default :
            	    break loop133;
                }
            } while (true);


            // PLSQL_DMLParser.g:639:9: ( where_clause )?
            int alt134=2;
            int LA134_0 = input.LA(1);

            if ( (LA134_0==SQL92_RESERVED_WHERE) ) {
                alt134=1;
            }
            switch (alt134) {
                case 1 :
                    // PLSQL_DMLParser.g:639:9: where_clause
                    {
                    pushFollow(FOLLOW_where_clause_in_merge_update_clause5530);
                    where_clause400=gPLSQLParser.where_clause();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_where_clause.add(where_clause400.getTree());

                    }
                    break;

            }


            // PLSQL_DMLParser.g:639:23: ( merge_update_delete_part )?
            int alt135=2;
            int LA135_0 = input.LA(1);

            if ( (LA135_0==SQL92_RESERVED_DELETE) ) {
                int LA135_1 = input.LA(2);

                if ( (LA135_1==SQL92_RESERVED_WHERE) ) {
                    alt135=1;
                }
            }
            switch (alt135) {
                case 1 :
                    // PLSQL_DMLParser.g:639:23: merge_update_delete_part
                    {
                    pushFollow(FOLLOW_merge_update_delete_part_in_merge_update_clause5533);
                    merge_update_delete_part401=merge_update_delete_part();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_merge_update_delete_part.add(merge_update_delete_part401.getTree());

                    }
                    break;

            }


            // AST REWRITE
            // elements: where_clause, merge_update_delete_part, merge_element
            // token labels: 
            // rule labels: retval
            // token list labels: 
            // rule list labels: 
            // wildcard labels: 
            if ( state.backtracking==0 ) {

            retval.tree = root_0;
            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

            root_0 = (Object)adaptor.nil();
            // 640:9: -> ^( MERGE_UPDATE ( merge_element )+ ( where_clause )? ( merge_update_delete_part )? )
            {
                // PLSQL_DMLParser.g:640:11: ^( MERGE_UPDATE ( merge_element )+ ( where_clause )? ( merge_update_delete_part )? )
                {
                Object root_1 = (Object)adaptor.nil();
                root_1 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(MERGE_UPDATE, "MERGE_UPDATE")
                , root_1);

                if ( !(stream_merge_element.hasNext()) ) {
                    throw new RewriteEarlyExitException();
                }
                while ( stream_merge_element.hasNext() ) {
                    adaptor.addChild(root_1, stream_merge_element.nextTree());

                }
                stream_merge_element.reset();

                // PLSQL_DMLParser.g:640:41: ( where_clause )?
                if ( stream_where_clause.hasNext() ) {
                    adaptor.addChild(root_1, stream_where_clause.nextTree());

                }
                stream_where_clause.reset();

                // PLSQL_DMLParser.g:640:55: ( merge_update_delete_part )?
                if ( stream_merge_update_delete_part.hasNext() ) {
                    adaptor.addChild(root_1, stream_merge_update_delete_part.nextTree());

                }
                stream_merge_update_delete_part.reset();

                adaptor.addChild(root_0, root_1);
                }

            }


            retval.tree = root_0;
            }

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "merge_update_clause"


    public static class merge_element_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "merge_element"
    // PLSQL_DMLParser.g:643:1: merge_element : column_name EQUALS_OP expression -> ^( ASSIGN[$EQUALS_OP] column_name ^( EXPR expression ) ) ;
    public final PLSQLParser_PLSQL_DMLParser.merge_element_return merge_element() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.merge_element_return retval = new PLSQLParser_PLSQL_DMLParser.merge_element_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token EQUALS_OP403=null;
        PLSQLParser_PLSQLCommons.column_name_return column_name402 =null;

        PLSQLParser_PLSQL_DMLParser.expression_return expression404 =null;


        Object EQUALS_OP403_tree=null;
        RewriteRuleTokenStream stream_EQUALS_OP=new RewriteRuleTokenStream(adaptor,"token EQUALS_OP");
        RewriteRuleSubtreeStream stream_expression=new RewriteRuleSubtreeStream(adaptor,"rule expression");
        RewriteRuleSubtreeStream stream_column_name=new RewriteRuleSubtreeStream(adaptor,"rule column_name");
        try {
            // PLSQL_DMLParser.g:644:5: ( column_name EQUALS_OP expression -> ^( ASSIGN[$EQUALS_OP] column_name ^( EXPR expression ) ) )
            // PLSQL_DMLParser.g:644:10: column_name EQUALS_OP expression
            {
            pushFollow(FOLLOW_column_name_in_merge_element5576);
            column_name402=gPLSQLParser.column_name();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_column_name.add(column_name402.getTree());

            EQUALS_OP403=(Token)match(input,EQUALS_OP,FOLLOW_EQUALS_OP_in_merge_element5578); if (state.failed) return retval; 
            if ( state.backtracking==0 ) stream_EQUALS_OP.add(EQUALS_OP403);


            pushFollow(FOLLOW_expression_in_merge_element5580);
            expression404=expression();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_expression.add(expression404.getTree());

            // AST REWRITE
            // elements: column_name, expression
            // token labels: 
            // rule labels: retval
            // token list labels: 
            // rule list labels: 
            // wildcard labels: 
            if ( state.backtracking==0 ) {

            retval.tree = root_0;
            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

            root_0 = (Object)adaptor.nil();
            // 645:9: -> ^( ASSIGN[$EQUALS_OP] column_name ^( EXPR expression ) )
            {
                // PLSQL_DMLParser.g:645:12: ^( ASSIGN[$EQUALS_OP] column_name ^( EXPR expression ) )
                {
                Object root_1 = (Object)adaptor.nil();
                root_1 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(ASSIGN, EQUALS_OP403)
                , root_1);

                adaptor.addChild(root_1, stream_column_name.nextTree());

                // PLSQL_DMLParser.g:645:45: ^( EXPR expression )
                {
                Object root_2 = (Object)adaptor.nil();
                root_2 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(EXPR, "EXPR")
                , root_2);

                adaptor.addChild(root_2, stream_expression.nextTree());

                adaptor.addChild(root_1, root_2);
                }

                adaptor.addChild(root_0, root_1);
                }

            }


            retval.tree = root_0;
            }

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "merge_element"


    public static class merge_update_delete_part_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "merge_update_delete_part"
    // PLSQL_DMLParser.g:648:1: merge_update_delete_part : delete_key ^ where_clause ;
    public final PLSQLParser_PLSQL_DMLParser.merge_update_delete_part_return merge_update_delete_part() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.merge_update_delete_part_return retval = new PLSQLParser_PLSQL_DMLParser.merge_update_delete_part_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        PLSQLParser_PLSQLKeys.delete_key_return delete_key405 =null;

        PLSQLParser_PLSQLCommons.where_clause_return where_clause406 =null;



        try {
            // PLSQL_DMLParser.g:649:5: ( delete_key ^ where_clause )
            // PLSQL_DMLParser.g:649:10: delete_key ^ where_clause
            {
            root_0 = (Object)adaptor.nil();


            pushFollow(FOLLOW_delete_key_in_merge_update_delete_part5623);
            delete_key405=gPLSQLParser.delete_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) root_0 = (Object)adaptor.becomeRoot(delete_key405.getTree(), root_0);

            pushFollow(FOLLOW_where_clause_in_merge_update_delete_part5626);
            where_clause406=gPLSQLParser.where_clause();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) adaptor.addChild(root_0, where_clause406.getTree());

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "merge_update_delete_part"


    public static class merge_insert_clause_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "merge_insert_clause"
    // PLSQL_DMLParser.g:652:1: merge_insert_clause : when_key not_key matched_key then_key insert_key ( LEFT_PAREN column_name ( COMMA column_name )* RIGHT_PAREN )? values_key expression_list ( where_clause )? -> ^( MERGE_INSERT ^( COLUMNS ( column_name )* ) expression_list ( where_clause )? ) ;
    public final PLSQLParser_PLSQL_DMLParser.merge_insert_clause_return merge_insert_clause() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.merge_insert_clause_return retval = new PLSQLParser_PLSQL_DMLParser.merge_insert_clause_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token LEFT_PAREN412=null;
        Token COMMA414=null;
        Token RIGHT_PAREN416=null;
        PLSQLParser_PLSQLKeys.when_key_return when_key407 =null;

        PLSQLParser_PLSQLKeys.not_key_return not_key408 =null;

        PLSQLParser_PLSQLKeys.matched_key_return matched_key409 =null;

        PLSQLParser_PLSQLKeys.then_key_return then_key410 =null;

        PLSQLParser_PLSQLKeys.insert_key_return insert_key411 =null;

        PLSQLParser_PLSQLCommons.column_name_return column_name413 =null;

        PLSQLParser_PLSQLCommons.column_name_return column_name415 =null;

        PLSQLParser_PLSQLKeys.values_key_return values_key417 =null;

        PLSQLParser_PLSQL_DMLParser.expression_list_return expression_list418 =null;

        PLSQLParser_PLSQLCommons.where_clause_return where_clause419 =null;


        Object LEFT_PAREN412_tree=null;
        Object COMMA414_tree=null;
        Object RIGHT_PAREN416_tree=null;
        RewriteRuleTokenStream stream_LEFT_PAREN=new RewriteRuleTokenStream(adaptor,"token LEFT_PAREN");
        RewriteRuleTokenStream stream_RIGHT_PAREN=new RewriteRuleTokenStream(adaptor,"token RIGHT_PAREN");
        RewriteRuleTokenStream stream_COMMA=new RewriteRuleTokenStream(adaptor,"token COMMA");
        RewriteRuleSubtreeStream stream_then_key=new RewriteRuleSubtreeStream(adaptor,"rule then_key");
        RewriteRuleSubtreeStream stream_expression_list=new RewriteRuleSubtreeStream(adaptor,"rule expression_list");
        RewriteRuleSubtreeStream stream_insert_key=new RewriteRuleSubtreeStream(adaptor,"rule insert_key");
        RewriteRuleSubtreeStream stream_values_key=new RewriteRuleSubtreeStream(adaptor,"rule values_key");
        RewriteRuleSubtreeStream stream_where_clause=new RewriteRuleSubtreeStream(adaptor,"rule where_clause");
        RewriteRuleSubtreeStream stream_not_key=new RewriteRuleSubtreeStream(adaptor,"rule not_key");
        RewriteRuleSubtreeStream stream_column_name=new RewriteRuleSubtreeStream(adaptor,"rule column_name");
        RewriteRuleSubtreeStream stream_when_key=new RewriteRuleSubtreeStream(adaptor,"rule when_key");
        RewriteRuleSubtreeStream stream_matched_key=new RewriteRuleSubtreeStream(adaptor,"rule matched_key");
        try {
            // PLSQL_DMLParser.g:653:5: ( when_key not_key matched_key then_key insert_key ( LEFT_PAREN column_name ( COMMA column_name )* RIGHT_PAREN )? values_key expression_list ( where_clause )? -> ^( MERGE_INSERT ^( COLUMNS ( column_name )* ) expression_list ( where_clause )? ) )
            // PLSQL_DMLParser.g:653:10: when_key not_key matched_key then_key insert_key ( LEFT_PAREN column_name ( COMMA column_name )* RIGHT_PAREN )? values_key expression_list ( where_clause )?
            {
            pushFollow(FOLLOW_when_key_in_merge_insert_clause5646);
            when_key407=gPLSQLParser.when_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_when_key.add(when_key407.getTree());

            pushFollow(FOLLOW_not_key_in_merge_insert_clause5648);
            not_key408=gPLSQLParser.not_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_not_key.add(not_key408.getTree());

            pushFollow(FOLLOW_matched_key_in_merge_insert_clause5650);
            matched_key409=gPLSQLParser.matched_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_matched_key.add(matched_key409.getTree());

            pushFollow(FOLLOW_then_key_in_merge_insert_clause5652);
            then_key410=gPLSQLParser.then_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_then_key.add(then_key410.getTree());

            pushFollow(FOLLOW_insert_key_in_merge_insert_clause5654);
            insert_key411=gPLSQLParser.insert_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_insert_key.add(insert_key411.getTree());

            // PLSQL_DMLParser.g:654:9: ( LEFT_PAREN column_name ( COMMA column_name )* RIGHT_PAREN )?
            int alt137=2;
            int LA137_0 = input.LA(1);

            if ( (LA137_0==LEFT_PAREN) ) {
                alt137=1;
            }
            switch (alt137) {
                case 1 :
                    // PLSQL_DMLParser.g:654:10: LEFT_PAREN column_name ( COMMA column_name )* RIGHT_PAREN
                    {
                    LEFT_PAREN412=(Token)match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_merge_insert_clause5666); if (state.failed) return retval; 
                    if ( state.backtracking==0 ) stream_LEFT_PAREN.add(LEFT_PAREN412);


                    pushFollow(FOLLOW_column_name_in_merge_insert_clause5668);
                    column_name413=gPLSQLParser.column_name();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_column_name.add(column_name413.getTree());

                    // PLSQL_DMLParser.g:654:33: ( COMMA column_name )*
                    loop136:
                    do {
                        int alt136=2;
                        int LA136_0 = input.LA(1);

                        if ( (LA136_0==COMMA) ) {
                            alt136=1;
                        }


                        switch (alt136) {
                    	case 1 :
                    	    // PLSQL_DMLParser.g:654:34: COMMA column_name
                    	    {
                    	    COMMA414=(Token)match(input,COMMA,FOLLOW_COMMA_in_merge_insert_clause5671); if (state.failed) return retval; 
                    	    if ( state.backtracking==0 ) stream_COMMA.add(COMMA414);


                    	    pushFollow(FOLLOW_column_name_in_merge_insert_clause5673);
                    	    column_name415=gPLSQLParser.column_name();

                    	    state._fsp--;
                    	    if (state.failed) return retval;
                    	    if ( state.backtracking==0 ) stream_column_name.add(column_name415.getTree());

                    	    }
                    	    break;

                    	default :
                    	    break loop136;
                        }
                    } while (true);


                    RIGHT_PAREN416=(Token)match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_merge_insert_clause5677); if (state.failed) return retval; 
                    if ( state.backtracking==0 ) stream_RIGHT_PAREN.add(RIGHT_PAREN416);


                    }
                    break;

            }


            pushFollow(FOLLOW_values_key_in_merge_insert_clause5689);
            values_key417=gPLSQLParser.values_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_values_key.add(values_key417.getTree());

            pushFollow(FOLLOW_expression_list_in_merge_insert_clause5691);
            expression_list418=expression_list();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_expression_list.add(expression_list418.getTree());

            // PLSQL_DMLParser.g:655:36: ( where_clause )?
            int alt138=2;
            int LA138_0 = input.LA(1);

            if ( (LA138_0==SQL92_RESERVED_WHERE) ) {
                alt138=1;
            }
            switch (alt138) {
                case 1 :
                    // PLSQL_DMLParser.g:655:36: where_clause
                    {
                    pushFollow(FOLLOW_where_clause_in_merge_insert_clause5693);
                    where_clause419=gPLSQLParser.where_clause();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_where_clause.add(where_clause419.getTree());

                    }
                    break;

            }


            // AST REWRITE
            // elements: where_clause, expression_list, column_name
            // token labels: 
            // rule labels: retval
            // token list labels: 
            // rule list labels: 
            // wildcard labels: 
            if ( state.backtracking==0 ) {

            retval.tree = root_0;
            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

            root_0 = (Object)adaptor.nil();
            // 656:9: -> ^( MERGE_INSERT ^( COLUMNS ( column_name )* ) expression_list ( where_clause )? )
            {
                // PLSQL_DMLParser.g:656:12: ^( MERGE_INSERT ^( COLUMNS ( column_name )* ) expression_list ( where_clause )? )
                {
                Object root_1 = (Object)adaptor.nil();
                root_1 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(MERGE_INSERT, "MERGE_INSERT")
                , root_1);

                // PLSQL_DMLParser.g:656:27: ^( COLUMNS ( column_name )* )
                {
                Object root_2 = (Object)adaptor.nil();
                root_2 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(COLUMNS, "COLUMNS")
                , root_2);

                // PLSQL_DMLParser.g:656:37: ( column_name )*
                while ( stream_column_name.hasNext() ) {
                    adaptor.addChild(root_2, stream_column_name.nextTree());

                }
                stream_column_name.reset();

                adaptor.addChild(root_1, root_2);
                }

                adaptor.addChild(root_1, stream_expression_list.nextTree());

                // PLSQL_DMLParser.g:656:67: ( where_clause )?
                if ( stream_where_clause.hasNext() ) {
                    adaptor.addChild(root_1, stream_where_clause.nextTree());

                }
                stream_where_clause.reset();

                adaptor.addChild(root_0, root_1);
                }

            }


            retval.tree = root_0;
            }

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "merge_insert_clause"


    public static class selected_tableview_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "selected_tableview"
    // PLSQL_DMLParser.g:659:1: selected_tableview : ( tableview_name | subquery ) ( alias )? -> ^( SELECTED_TABLEVIEW ( alias )? ( tableview_name )? ( subquery )? ) ;
    public final PLSQLParser_PLSQL_DMLParser.selected_tableview_return selected_tableview() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.selected_tableview_return retval = new PLSQLParser_PLSQL_DMLParser.selected_tableview_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        PLSQLParser_PLSQLCommons.tableview_name_return tableview_name420 =null;

        PLSQLParser_PLSQL_DMLParser.subquery_return subquery421 =null;

        PLSQLParser_PLSQLCommons.alias_return alias422 =null;


        RewriteRuleSubtreeStream stream_alias=new RewriteRuleSubtreeStream(adaptor,"rule alias");
        RewriteRuleSubtreeStream stream_tableview_name=new RewriteRuleSubtreeStream(adaptor,"rule tableview_name");
        RewriteRuleSubtreeStream stream_subquery=new RewriteRuleSubtreeStream(adaptor,"rule subquery");
        try {
            // PLSQL_DMLParser.g:660:5: ( ( tableview_name | subquery ) ( alias )? -> ^( SELECTED_TABLEVIEW ( alias )? ( tableview_name )? ( subquery )? ) )
            // PLSQL_DMLParser.g:660:10: ( tableview_name | subquery ) ( alias )?
            {
            // PLSQL_DMLParser.g:660:10: ( tableview_name | subquery )
            int alt139=2;
            int LA139_0 = input.LA(1);

            if ( (LA139_0==DELIMITED_ID||LA139_0==INTRODUCER||LA139_0==REGULAR_ID) ) {
                alt139=1;
            }
            else if ( (LA139_0==LEFT_PAREN||LA139_0==SQL92_RESERVED_SELECT) ) {
                alt139=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return retval;}
                NoViableAltException nvae =
                    new NoViableAltException("", 139, 0, input);

                throw nvae;

            }
            switch (alt139) {
                case 1 :
                    // PLSQL_DMLParser.g:660:12: tableview_name
                    {
                    pushFollow(FOLLOW_tableview_name_in_selected_tableview5743);
                    tableview_name420=gPLSQLParser.tableview_name();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_tableview_name.add(tableview_name420.getTree());

                    }
                    break;
                case 2 :
                    // PLSQL_DMLParser.g:660:29: subquery
                    {
                    pushFollow(FOLLOW_subquery_in_selected_tableview5747);
                    subquery421=subquery();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_subquery.add(subquery421.getTree());

                    }
                    break;

            }


            // PLSQL_DMLParser.g:660:40: ( alias )?
            int alt140=2;
            int LA140_0 = input.LA(1);

            if ( (LA140_0==CHAR_STRING||LA140_0==DELIMITED_ID||LA140_0==INTRODUCER||LA140_0==REGULAR_ID||LA140_0==SQL92_RESERVED_AS) ) {
                alt140=1;
            }
            switch (alt140) {
                case 1 :
                    // PLSQL_DMLParser.g:660:40: alias
                    {
                    pushFollow(FOLLOW_alias_in_selected_tableview5751);
                    alias422=gPLSQLParser.alias();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_alias.add(alias422.getTree());

                    }
                    break;

            }


            // AST REWRITE
            // elements: alias, tableview_name, subquery
            // token labels: 
            // rule labels: retval
            // token list labels: 
            // rule list labels: 
            // wildcard labels: 
            if ( state.backtracking==0 ) {

            retval.tree = root_0;
            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

            root_0 = (Object)adaptor.nil();
            // 661:9: -> ^( SELECTED_TABLEVIEW ( alias )? ( tableview_name )? ( subquery )? )
            {
                // PLSQL_DMLParser.g:661:12: ^( SELECTED_TABLEVIEW ( alias )? ( tableview_name )? ( subquery )? )
                {
                Object root_1 = (Object)adaptor.nil();
                root_1 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(SELECTED_TABLEVIEW, "SELECTED_TABLEVIEW")
                , root_1);

                // PLSQL_DMLParser.g:661:33: ( alias )?
                if ( stream_alias.hasNext() ) {
                    adaptor.addChild(root_1, stream_alias.nextTree());

                }
                stream_alias.reset();

                // PLSQL_DMLParser.g:661:40: ( tableview_name )?
                if ( stream_tableview_name.hasNext() ) {
                    adaptor.addChild(root_1, stream_tableview_name.nextTree());

                }
                stream_tableview_name.reset();

                // PLSQL_DMLParser.g:661:56: ( subquery )?
                if ( stream_subquery.hasNext() ) {
                    adaptor.addChild(root_1, stream_subquery.nextTree());

                }
                stream_subquery.reset();

                adaptor.addChild(root_0, root_1);
                }

            }


            retval.tree = root_0;
            }

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "selected_tableview"


    public static class lock_table_statement_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "lock_table_statement"
    // PLSQL_DMLParser.g:666:1: lock_table_statement : lock_key table_key lock_table_element ( COMMA lock_table_element )* in_key lock_mode mode_key ( wait_nowait_part )? -> ^( lock_key ( lock_table_element )+ lock_mode ( wait_nowait_part )? ) ;
    public final PLSQLParser_PLSQL_DMLParser.lock_table_statement_return lock_table_statement() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.lock_table_statement_return retval = new PLSQLParser_PLSQL_DMLParser.lock_table_statement_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token COMMA426=null;
        PLSQLParser_PLSQLKeys.lock_key_return lock_key423 =null;

        PLSQLParser_PLSQLKeys.table_key_return table_key424 =null;

        PLSQLParser_PLSQL_DMLParser.lock_table_element_return lock_table_element425 =null;

        PLSQLParser_PLSQL_DMLParser.lock_table_element_return lock_table_element427 =null;

        PLSQLParser_PLSQLKeys.in_key_return in_key428 =null;

        PLSQLParser_PLSQL_DMLParser.lock_mode_return lock_mode429 =null;

        PLSQLParser_PLSQLKeys.mode_key_return mode_key430 =null;

        PLSQLParser_PLSQL_DMLParser.wait_nowait_part_return wait_nowait_part431 =null;


        Object COMMA426_tree=null;
        RewriteRuleTokenStream stream_COMMA=new RewriteRuleTokenStream(adaptor,"token COMMA");
        RewriteRuleSubtreeStream stream_lock_table_element=new RewriteRuleSubtreeStream(adaptor,"rule lock_table_element");
        RewriteRuleSubtreeStream stream_mode_key=new RewriteRuleSubtreeStream(adaptor,"rule mode_key");
        RewriteRuleSubtreeStream stream_table_key=new RewriteRuleSubtreeStream(adaptor,"rule table_key");
        RewriteRuleSubtreeStream stream_lock_mode=new RewriteRuleSubtreeStream(adaptor,"rule lock_mode");
        RewriteRuleSubtreeStream stream_wait_nowait_part=new RewriteRuleSubtreeStream(adaptor,"rule wait_nowait_part");
        RewriteRuleSubtreeStream stream_lock_key=new RewriteRuleSubtreeStream(adaptor,"rule lock_key");
        RewriteRuleSubtreeStream stream_in_key=new RewriteRuleSubtreeStream(adaptor,"rule in_key");
        try {
            // PLSQL_DMLParser.g:667:5: ( lock_key table_key lock_table_element ( COMMA lock_table_element )* in_key lock_mode mode_key ( wait_nowait_part )? -> ^( lock_key ( lock_table_element )+ lock_mode ( wait_nowait_part )? ) )
            // PLSQL_DMLParser.g:667:10: lock_key table_key lock_table_element ( COMMA lock_table_element )* in_key lock_mode mode_key ( wait_nowait_part )?
            {
            pushFollow(FOLLOW_lock_key_in_lock_table_statement5797);
            lock_key423=gPLSQLParser.lock_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_lock_key.add(lock_key423.getTree());

            pushFollow(FOLLOW_table_key_in_lock_table_statement5799);
            table_key424=gPLSQLParser.table_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_table_key.add(table_key424.getTree());

            pushFollow(FOLLOW_lock_table_element_in_lock_table_statement5810);
            lock_table_element425=lock_table_element();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_lock_table_element.add(lock_table_element425.getTree());

            // PLSQL_DMLParser.g:668:28: ( COMMA lock_table_element )*
            loop141:
            do {
                int alt141=2;
                int LA141_0 = input.LA(1);

                if ( (LA141_0==COMMA) ) {
                    alt141=1;
                }


                switch (alt141) {
            	case 1 :
            	    // PLSQL_DMLParser.g:668:29: COMMA lock_table_element
            	    {
            	    COMMA426=(Token)match(input,COMMA,FOLLOW_COMMA_in_lock_table_statement5813); if (state.failed) return retval; 
            	    if ( state.backtracking==0 ) stream_COMMA.add(COMMA426);


            	    pushFollow(FOLLOW_lock_table_element_in_lock_table_statement5815);
            	    lock_table_element427=lock_table_element();

            	    state._fsp--;
            	    if (state.failed) return retval;
            	    if ( state.backtracking==0 ) stream_lock_table_element.add(lock_table_element427.getTree());

            	    }
            	    break;

            	default :
            	    break loop141;
                }
            } while (true);


            pushFollow(FOLLOW_in_key_in_lock_table_statement5828);
            in_key428=gPLSQLParser.in_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_in_key.add(in_key428.getTree());

            pushFollow(FOLLOW_lock_mode_in_lock_table_statement5830);
            lock_mode429=lock_mode();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_lock_mode.add(lock_mode429.getTree());

            pushFollow(FOLLOW_mode_key_in_lock_table_statement5832);
            mode_key430=gPLSQLParser.mode_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_mode_key.add(mode_key430.getTree());

            // PLSQL_DMLParser.g:669:35: ( wait_nowait_part )?
            int alt142=2;
            int LA142_0 = input.LA(1);

            if ( (LA142_0==REGULAR_ID) && ((input.LT(1).getText().equalsIgnoreCase("wait")))) {
                alt142=1;
            }
            else if ( (LA142_0==PLSQL_RESERVED_NOWAIT) ) {
                alt142=1;
            }
            switch (alt142) {
                case 1 :
                    // PLSQL_DMLParser.g:669:35: wait_nowait_part
                    {
                    pushFollow(FOLLOW_wait_nowait_part_in_lock_table_statement5834);
                    wait_nowait_part431=wait_nowait_part();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_wait_nowait_part.add(wait_nowait_part431.getTree());

                    }
                    break;

            }


            // AST REWRITE
            // elements: wait_nowait_part, lock_table_element, lock_mode, lock_key
            // token labels: 
            // rule labels: retval
            // token list labels: 
            // rule list labels: 
            // wildcard labels: 
            if ( state.backtracking==0 ) {

            retval.tree = root_0;
            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

            root_0 = (Object)adaptor.nil();
            // 670:9: -> ^( lock_key ( lock_table_element )+ lock_mode ( wait_nowait_part )? )
            {
                // PLSQL_DMLParser.g:670:12: ^( lock_key ( lock_table_element )+ lock_mode ( wait_nowait_part )? )
                {
                Object root_1 = (Object)adaptor.nil();
                root_1 = (Object)adaptor.becomeRoot(stream_lock_key.nextNode(), root_1);

                if ( !(stream_lock_table_element.hasNext()) ) {
                    throw new RewriteEarlyExitException();
                }
                while ( stream_lock_table_element.hasNext() ) {
                    adaptor.addChild(root_1, stream_lock_table_element.nextTree());

                }
                stream_lock_table_element.reset();

                adaptor.addChild(root_1, stream_lock_mode.nextTree());

                // PLSQL_DMLParser.g:670:53: ( wait_nowait_part )?
                if ( stream_wait_nowait_part.hasNext() ) {
                    adaptor.addChild(root_1, stream_wait_nowait_part.nextTree());

                }
                stream_wait_nowait_part.reset();

                adaptor.addChild(root_0, root_1);
                }

            }


            retval.tree = root_0;
            }

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "lock_table_statement"


    public static class wait_nowait_part_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "wait_nowait_part"
    // PLSQL_DMLParser.g:673:1: wait_nowait_part : ( wait_key expression -> ^( wait_key ^( EXPR expression ) ) | nowait_key );
    public final PLSQLParser_PLSQL_DMLParser.wait_nowait_part_return wait_nowait_part() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.wait_nowait_part_return retval = new PLSQLParser_PLSQL_DMLParser.wait_nowait_part_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        PLSQLParser_PLSQLKeys.wait_key_return wait_key432 =null;

        PLSQLParser_PLSQL_DMLParser.expression_return expression433 =null;

        PLSQLParser_PLSQLKeys.nowait_key_return nowait_key434 =null;


        RewriteRuleSubtreeStream stream_expression=new RewriteRuleSubtreeStream(adaptor,"rule expression");
        RewriteRuleSubtreeStream stream_wait_key=new RewriteRuleSubtreeStream(adaptor,"rule wait_key");
        try {
            // PLSQL_DMLParser.g:674:5: ( wait_key expression -> ^( wait_key ^( EXPR expression ) ) | nowait_key )
            int alt143=2;
            int LA143_0 = input.LA(1);

            if ( (LA143_0==REGULAR_ID) && ((input.LT(1).getText().equalsIgnoreCase("wait")))) {
                alt143=1;
            }
            else if ( (LA143_0==PLSQL_RESERVED_NOWAIT) ) {
                alt143=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return retval;}
                NoViableAltException nvae =
                    new NoViableAltException("", 143, 0, input);

                throw nvae;

            }
            switch (alt143) {
                case 1 :
                    // PLSQL_DMLParser.g:674:10: wait_key expression
                    {
                    pushFollow(FOLLOW_wait_key_in_wait_nowait_part5877);
                    wait_key432=gPLSQLParser.wait_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_wait_key.add(wait_key432.getTree());

                    pushFollow(FOLLOW_expression_in_wait_nowait_part5879);
                    expression433=expression();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_expression.add(expression433.getTree());

                    // AST REWRITE
                    // elements: expression, wait_key
                    // token labels: 
                    // rule labels: retval
                    // token list labels: 
                    // rule list labels: 
                    // wildcard labels: 
                    if ( state.backtracking==0 ) {

                    retval.tree = root_0;
                    RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

                    root_0 = (Object)adaptor.nil();
                    // 674:30: -> ^( wait_key ^( EXPR expression ) )
                    {
                        // PLSQL_DMLParser.g:674:33: ^( wait_key ^( EXPR expression ) )
                        {
                        Object root_1 = (Object)adaptor.nil();
                        root_1 = (Object)adaptor.becomeRoot(stream_wait_key.nextNode(), root_1);

                        // PLSQL_DMLParser.g:674:44: ^( EXPR expression )
                        {
                        Object root_2 = (Object)adaptor.nil();
                        root_2 = (Object)adaptor.becomeRoot(
                        (Object)adaptor.create(EXPR, "EXPR")
                        , root_2);

                        adaptor.addChild(root_2, stream_expression.nextTree());

                        adaptor.addChild(root_1, root_2);
                        }

                        adaptor.addChild(root_0, root_1);
                        }

                    }


                    retval.tree = root_0;
                    }

                    }
                    break;
                case 2 :
                    // PLSQL_DMLParser.g:675:10: nowait_key
                    {
                    root_0 = (Object)adaptor.nil();


                    pushFollow(FOLLOW_nowait_key_in_wait_nowait_part5902);
                    nowait_key434=gPLSQLParser.nowait_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, nowait_key434.getTree());

                    }
                    break;

            }
            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "wait_nowait_part"


    public static class lock_table_element_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "lock_table_element"
    // PLSQL_DMLParser.g:680:1: lock_table_element : tableview_name ( partition_extension_clause )? -> ^( LOCK_TABLE_ELEMENT tableview_name ( partition_extension_clause )? ) ;
    public final PLSQLParser_PLSQL_DMLParser.lock_table_element_return lock_table_element() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.lock_table_element_return retval = new PLSQLParser_PLSQL_DMLParser.lock_table_element_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        PLSQLParser_PLSQLCommons.tableview_name_return tableview_name435 =null;

        PLSQLParser_PLSQLCommons.partition_extension_clause_return partition_extension_clause436 =null;


        RewriteRuleSubtreeStream stream_partition_extension_clause=new RewriteRuleSubtreeStream(adaptor,"rule partition_extension_clause");
        RewriteRuleSubtreeStream stream_tableview_name=new RewriteRuleSubtreeStream(adaptor,"rule tableview_name");
        try {
            // PLSQL_DMLParser.g:681:5: ( tableview_name ( partition_extension_clause )? -> ^( LOCK_TABLE_ELEMENT tableview_name ( partition_extension_clause )? ) )
            // PLSQL_DMLParser.g:681:10: tableview_name ( partition_extension_clause )?
            {
            pushFollow(FOLLOW_tableview_name_in_lock_table_element5924);
            tableview_name435=gPLSQLParser.tableview_name();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_tableview_name.add(tableview_name435.getTree());

            // PLSQL_DMLParser.g:681:25: ( partition_extension_clause )?
            int alt144=2;
            int LA144_0 = input.LA(1);

            if ( (LA144_0==REGULAR_ID) && (((input.LT(1).getText().equalsIgnoreCase("subpartition"))||(input.LT(1).getText().equalsIgnoreCase("partition"))))) {
                alt144=1;
            }
            switch (alt144) {
                case 1 :
                    // PLSQL_DMLParser.g:681:25: partition_extension_clause
                    {
                    pushFollow(FOLLOW_partition_extension_clause_in_lock_table_element5926);
                    partition_extension_clause436=gPLSQLParser.partition_extension_clause();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_partition_extension_clause.add(partition_extension_clause436.getTree());

                    }
                    break;

            }


            // AST REWRITE
            // elements: tableview_name, partition_extension_clause
            // token labels: 
            // rule labels: retval
            // token list labels: 
            // rule list labels: 
            // wildcard labels: 
            if ( state.backtracking==0 ) {

            retval.tree = root_0;
            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

            root_0 = (Object)adaptor.nil();
            // 682:9: -> ^( LOCK_TABLE_ELEMENT tableview_name ( partition_extension_clause )? )
            {
                // PLSQL_DMLParser.g:682:12: ^( LOCK_TABLE_ELEMENT tableview_name ( partition_extension_clause )? )
                {
                Object root_1 = (Object)adaptor.nil();
                root_1 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(LOCK_TABLE_ELEMENT, "LOCK_TABLE_ELEMENT")
                , root_1);

                adaptor.addChild(root_1, stream_tableview_name.nextTree());

                // PLSQL_DMLParser.g:682:48: ( partition_extension_clause )?
                if ( stream_partition_extension_clause.hasNext() ) {
                    adaptor.addChild(root_1, stream_partition_extension_clause.nextTree());

                }
                stream_partition_extension_clause.reset();

                adaptor.addChild(root_0, root_1);
                }

            }


            retval.tree = root_0;
            }

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "lock_table_element"


    public static class lock_mode_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "lock_mode"
    // PLSQL_DMLParser.g:685:1: lock_mode : ( row_key share_key | row_key exclusive_key | share_key ( update_key )? | share_key row_key exclusive_key | exclusive_key );
    public final PLSQLParser_PLSQL_DMLParser.lock_mode_return lock_mode() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.lock_mode_return retval = new PLSQLParser_PLSQL_DMLParser.lock_mode_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        PLSQLParser_PLSQLKeys.row_key_return row_key437 =null;

        PLSQLParser_PLSQLKeys.share_key_return share_key438 =null;

        PLSQLParser_PLSQLKeys.row_key_return row_key439 =null;

        PLSQLParser_PLSQLKeys.exclusive_key_return exclusive_key440 =null;

        PLSQLParser_PLSQLKeys.share_key_return share_key441 =null;

        PLSQLParser_PLSQLKeys.update_key_return update_key442 =null;

        PLSQLParser_PLSQLKeys.share_key_return share_key443 =null;

        PLSQLParser_PLSQLKeys.row_key_return row_key444 =null;

        PLSQLParser_PLSQLKeys.exclusive_key_return exclusive_key445 =null;

        PLSQLParser_PLSQLKeys.exclusive_key_return exclusive_key446 =null;



        try {
            // PLSQL_DMLParser.g:686:5: ( row_key share_key | row_key exclusive_key | share_key ( update_key )? | share_key row_key exclusive_key | exclusive_key )
            int alt146=5;
            switch ( input.LA(1) ) {
            case REGULAR_ID:
                {
                int LA146_1 = input.LA(2);

                if ( (LA146_1==PLSQL_RESERVED_SHARE) ) {
                    alt146=1;
                }
                else if ( (LA146_1==PLSQL_RESERVED_EXCLUSIVE) ) {
                    alt146=2;
                }
                else {
                    if (state.backtracking>0) {state.failed=true; return retval;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 146, 1, input);

                    throw nvae;

                }
                }
                break;
            case PLSQL_RESERVED_SHARE:
                {
                int LA146_2 = input.LA(2);

                if ( (LA146_2==PLSQL_RESERVED_MODE||LA146_2==SQL92_RESERVED_UPDATE) ) {
                    alt146=3;
                }
                else if ( (LA146_2==REGULAR_ID) ) {
                    alt146=4;
                }
                else {
                    if (state.backtracking>0) {state.failed=true; return retval;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 146, 2, input);

                    throw nvae;

                }
                }
                break;
            case PLSQL_RESERVED_EXCLUSIVE:
                {
                alt146=5;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return retval;}
                NoViableAltException nvae =
                    new NoViableAltException("", 146, 0, input);

                throw nvae;

            }

            switch (alt146) {
                case 1 :
                    // PLSQL_DMLParser.g:686:10: row_key share_key
                    {
                    root_0 = (Object)adaptor.nil();


                    pushFollow(FOLLOW_row_key_in_lock_mode5966);
                    row_key437=gPLSQLParser.row_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, row_key437.getTree());

                    pushFollow(FOLLOW_share_key_in_lock_mode5968);
                    share_key438=gPLSQLParser.share_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, share_key438.getTree());

                    }
                    break;
                case 2 :
                    // PLSQL_DMLParser.g:687:10: row_key exclusive_key
                    {
                    root_0 = (Object)adaptor.nil();


                    pushFollow(FOLLOW_row_key_in_lock_mode5979);
                    row_key439=gPLSQLParser.row_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, row_key439.getTree());

                    pushFollow(FOLLOW_exclusive_key_in_lock_mode5981);
                    exclusive_key440=gPLSQLParser.exclusive_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, exclusive_key440.getTree());

                    }
                    break;
                case 3 :
                    // PLSQL_DMLParser.g:688:10: share_key ( update_key )?
                    {
                    root_0 = (Object)adaptor.nil();


                    pushFollow(FOLLOW_share_key_in_lock_mode5992);
                    share_key441=gPLSQLParser.share_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, share_key441.getTree());

                    // PLSQL_DMLParser.g:688:20: ( update_key )?
                    int alt145=2;
                    int LA145_0 = input.LA(1);

                    if ( (LA145_0==SQL92_RESERVED_UPDATE) ) {
                        alt145=1;
                    }
                    switch (alt145) {
                        case 1 :
                            // PLSQL_DMLParser.g:688:20: update_key
                            {
                            pushFollow(FOLLOW_update_key_in_lock_mode5994);
                            update_key442=gPLSQLParser.update_key();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) adaptor.addChild(root_0, update_key442.getTree());

                            }
                            break;

                    }


                    }
                    break;
                case 4 :
                    // PLSQL_DMLParser.g:689:10: share_key row_key exclusive_key
                    {
                    root_0 = (Object)adaptor.nil();


                    pushFollow(FOLLOW_share_key_in_lock_mode6006);
                    share_key443=gPLSQLParser.share_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, share_key443.getTree());

                    pushFollow(FOLLOW_row_key_in_lock_mode6008);
                    row_key444=gPLSQLParser.row_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, row_key444.getTree());

                    pushFollow(FOLLOW_exclusive_key_in_lock_mode6010);
                    exclusive_key445=gPLSQLParser.exclusive_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, exclusive_key445.getTree());

                    }
                    break;
                case 5 :
                    // PLSQL_DMLParser.g:690:10: exclusive_key
                    {
                    root_0 = (Object)adaptor.nil();


                    pushFollow(FOLLOW_exclusive_key_in_lock_mode6021);
                    exclusive_key446=gPLSQLParser.exclusive_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, exclusive_key446.getTree());

                    }
                    break;

            }
            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "lock_mode"


    public static class general_table_ref_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "general_table_ref"
    // PLSQL_DMLParser.g:696:1: general_table_ref : ( dml_table_expression_clause | only_key LEFT_PAREN dml_table_expression_clause RIGHT_PAREN ) ( alias )? -> ^( TABLE_REF ( alias )? dml_table_expression_clause ( only_key )? ) ;
    public final PLSQLParser_PLSQL_DMLParser.general_table_ref_return general_table_ref() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.general_table_ref_return retval = new PLSQLParser_PLSQL_DMLParser.general_table_ref_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token LEFT_PAREN449=null;
        Token RIGHT_PAREN451=null;
        PLSQLParser_PLSQL_DMLParser.dml_table_expression_clause_return dml_table_expression_clause447 =null;

        PLSQLParser_PLSQLKeys.only_key_return only_key448 =null;

        PLSQLParser_PLSQL_DMLParser.dml_table_expression_clause_return dml_table_expression_clause450 =null;

        PLSQLParser_PLSQLCommons.alias_return alias452 =null;


        Object LEFT_PAREN449_tree=null;
        Object RIGHT_PAREN451_tree=null;
        RewriteRuleTokenStream stream_LEFT_PAREN=new RewriteRuleTokenStream(adaptor,"token LEFT_PAREN");
        RewriteRuleTokenStream stream_RIGHT_PAREN=new RewriteRuleTokenStream(adaptor,"token RIGHT_PAREN");
        RewriteRuleSubtreeStream stream_dml_table_expression_clause=new RewriteRuleSubtreeStream(adaptor,"rule dml_table_expression_clause");
        RewriteRuleSubtreeStream stream_alias=new RewriteRuleSubtreeStream(adaptor,"rule alias");
        RewriteRuleSubtreeStream stream_only_key=new RewriteRuleSubtreeStream(adaptor,"rule only_key");
        try {
            // PLSQL_DMLParser.g:697:5: ( ( dml_table_expression_clause | only_key LEFT_PAREN dml_table_expression_clause RIGHT_PAREN ) ( alias )? -> ^( TABLE_REF ( alias )? dml_table_expression_clause ( only_key )? ) )
            // PLSQL_DMLParser.g:697:10: ( dml_table_expression_clause | only_key LEFT_PAREN dml_table_expression_clause RIGHT_PAREN ) ( alias )?
            {
            // PLSQL_DMLParser.g:697:10: ( dml_table_expression_clause | only_key LEFT_PAREN dml_table_expression_clause RIGHT_PAREN )
            int alt147=2;
            int LA147_0 = input.LA(1);

            if ( (LA147_0==DELIMITED_ID||LA147_0==INTRODUCER||LA147_0==LEFT_PAREN||LA147_0==SQL92_RESERVED_TABLE) ) {
                alt147=1;
            }
            else if ( (LA147_0==REGULAR_ID) ) {
                int LA147_4 = input.LA(2);

                if ( (!(((input.LT(1).getText().equalsIgnoreCase("only"))))) ) {
                    alt147=1;
                }
                else if ( ((input.LT(1).getText().equalsIgnoreCase("only"))) ) {
                    alt147=2;
                }
                else {
                    if (state.backtracking>0) {state.failed=true; return retval;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 147, 4, input);

                    throw nvae;

                }
            }
            else {
                if (state.backtracking>0) {state.failed=true; return retval;}
                NoViableAltException nvae =
                    new NoViableAltException("", 147, 0, input);

                throw nvae;

            }
            switch (alt147) {
                case 1 :
                    // PLSQL_DMLParser.g:697:15: dml_table_expression_clause
                    {
                    pushFollow(FOLLOW_dml_table_expression_clause_in_general_table_ref6049);
                    dml_table_expression_clause447=dml_table_expression_clause();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_dml_table_expression_clause.add(dml_table_expression_clause447.getTree());

                    }
                    break;
                case 2 :
                    // PLSQL_DMLParser.g:698:14: only_key LEFT_PAREN dml_table_expression_clause RIGHT_PAREN
                    {
                    pushFollow(FOLLOW_only_key_in_general_table_ref6064);
                    only_key448=gPLSQLParser.only_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_only_key.add(only_key448.getTree());

                    LEFT_PAREN449=(Token)match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_general_table_ref6066); if (state.failed) return retval; 
                    if ( state.backtracking==0 ) stream_LEFT_PAREN.add(LEFT_PAREN449);


                    pushFollow(FOLLOW_dml_table_expression_clause_in_general_table_ref6068);
                    dml_table_expression_clause450=dml_table_expression_clause();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_dml_table_expression_clause.add(dml_table_expression_clause450.getTree());

                    RIGHT_PAREN451=(Token)match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_general_table_ref6070); if (state.failed) return retval; 
                    if ( state.backtracking==0 ) stream_RIGHT_PAREN.add(RIGHT_PAREN451);


                    }
                    break;

            }


            // PLSQL_DMLParser.g:699:14: ( alias )?
            int alt148=2;
            switch ( input.LA(1) ) {
                case INTRODUCER:
                case SQL92_RESERVED_AS:
                    {
                    alt148=1;
                    }
                    break;
                case REGULAR_ID:
                    {
                    alt148=1;
                    }
                    break;
                case CHAR_STRING:
                case DELIMITED_ID:
                    {
                    alt148=1;
                    }
                    break;
            }

            switch (alt148) {
                case 1 :
                    // PLSQL_DMLParser.g:699:14: alias
                    {
                    pushFollow(FOLLOW_alias_in_general_table_ref6085);
                    alias452=gPLSQLParser.alias();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_alias.add(alias452.getTree());

                    }
                    break;

            }


            // AST REWRITE
            // elements: dml_table_expression_clause, alias, only_key
            // token labels: 
            // rule labels: retval
            // token list labels: 
            // rule list labels: 
            // wildcard labels: 
            if ( state.backtracking==0 ) {

            retval.tree = root_0;
            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

            root_0 = (Object)adaptor.nil();
            // 700:9: -> ^( TABLE_REF ( alias )? dml_table_expression_clause ( only_key )? )
            {
                // PLSQL_DMLParser.g:700:12: ^( TABLE_REF ( alias )? dml_table_expression_clause ( only_key )? )
                {
                Object root_1 = (Object)adaptor.nil();
                root_1 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(TABLE_REF, "TABLE_REF")
                , root_1);

                // PLSQL_DMLParser.g:700:24: ( alias )?
                if ( stream_alias.hasNext() ) {
                    adaptor.addChild(root_1, stream_alias.nextTree());

                }
                stream_alias.reset();

                adaptor.addChild(root_1, stream_dml_table_expression_clause.nextTree());

                // PLSQL_DMLParser.g:700:59: ( only_key )?
                if ( stream_only_key.hasNext() ) {
                    adaptor.addChild(root_1, stream_only_key.nextTree());

                }
                stream_only_key.reset();

                adaptor.addChild(root_0, root_1);
                }

            }


            retval.tree = root_0;
            }

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "general_table_ref"


    public static class static_returning_clause_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "static_returning_clause"
    // PLSQL_DMLParser.g:703:1: static_returning_clause : ( returning_key | return_key ) expression ( COMMA expression )* into_clause -> ^( STATIC_RETURNING ( ^( EXPR expression ) )+ into_clause ) ;
    public final PLSQLParser_PLSQL_DMLParser.static_returning_clause_return static_returning_clause() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.static_returning_clause_return retval = new PLSQLParser_PLSQL_DMLParser.static_returning_clause_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token COMMA456=null;
        PLSQLParser_PLSQLKeys.returning_key_return returning_key453 =null;

        PLSQLParser_PLSQLKeys.return_key_return return_key454 =null;

        PLSQLParser_PLSQL_DMLParser.expression_return expression455 =null;

        PLSQLParser_PLSQL_DMLParser.expression_return expression457 =null;

        PLSQLParser_PLSQLCommons.into_clause_return into_clause458 =null;


        Object COMMA456_tree=null;
        RewriteRuleTokenStream stream_COMMA=new RewriteRuleTokenStream(adaptor,"token COMMA");
        RewriteRuleSubtreeStream stream_returning_key=new RewriteRuleSubtreeStream(adaptor,"rule returning_key");
        RewriteRuleSubtreeStream stream_expression=new RewriteRuleSubtreeStream(adaptor,"rule expression");
        RewriteRuleSubtreeStream stream_return_key=new RewriteRuleSubtreeStream(adaptor,"rule return_key");
        RewriteRuleSubtreeStream stream_into_clause=new RewriteRuleSubtreeStream(adaptor,"rule into_clause");
        try {
            // PLSQL_DMLParser.g:704:5: ( ( returning_key | return_key ) expression ( COMMA expression )* into_clause -> ^( STATIC_RETURNING ( ^( EXPR expression ) )+ into_clause ) )
            // PLSQL_DMLParser.g:704:10: ( returning_key | return_key ) expression ( COMMA expression )* into_clause
            {
            // PLSQL_DMLParser.g:704:10: ( returning_key | return_key )
            int alt149=2;
            int LA149_0 = input.LA(1);

            if ( (LA149_0==REGULAR_ID) ) {
                int LA149_1 = input.LA(2);

                if ( ((input.LT(1).getText().equalsIgnoreCase("returning"))) ) {
                    alt149=1;
                }
                else if ( ((input.LT(1).getText().equalsIgnoreCase("return"))) ) {
                    alt149=2;
                }
                else {
                    if (state.backtracking>0) {state.failed=true; return retval;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 149, 1, input);

                    throw nvae;

                }
            }
            else {
                if (state.backtracking>0) {state.failed=true; return retval;}
                NoViableAltException nvae =
                    new NoViableAltException("", 149, 0, input);

                throw nvae;

            }
            switch (alt149) {
                case 1 :
                    // PLSQL_DMLParser.g:704:11: returning_key
                    {
                    pushFollow(FOLLOW_returning_key_in_static_returning_clause6129);
                    returning_key453=gPLSQLParser.returning_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_returning_key.add(returning_key453.getTree());

                    }
                    break;
                case 2 :
                    // PLSQL_DMLParser.g:704:25: return_key
                    {
                    pushFollow(FOLLOW_return_key_in_static_returning_clause6131);
                    return_key454=gPLSQLParser.return_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_return_key.add(return_key454.getTree());

                    }
                    break;

            }


            pushFollow(FOLLOW_expression_in_static_returning_clause6134);
            expression455=expression();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_expression.add(expression455.getTree());

            // PLSQL_DMLParser.g:704:48: ( COMMA expression )*
            loop150:
            do {
                int alt150=2;
                int LA150_0 = input.LA(1);

                if ( (LA150_0==COMMA) ) {
                    alt150=1;
                }


                switch (alt150) {
            	case 1 :
            	    // PLSQL_DMLParser.g:704:49: COMMA expression
            	    {
            	    COMMA456=(Token)match(input,COMMA,FOLLOW_COMMA_in_static_returning_clause6137); if (state.failed) return retval; 
            	    if ( state.backtracking==0 ) stream_COMMA.add(COMMA456);


            	    pushFollow(FOLLOW_expression_in_static_returning_clause6139);
            	    expression457=expression();

            	    state._fsp--;
            	    if (state.failed) return retval;
            	    if ( state.backtracking==0 ) stream_expression.add(expression457.getTree());

            	    }
            	    break;

            	default :
            	    break loop150;
                }
            } while (true);


            pushFollow(FOLLOW_into_clause_in_static_returning_clause6152);
            into_clause458=gPLSQLParser.into_clause();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_into_clause.add(into_clause458.getTree());

            // AST REWRITE
            // elements: expression, into_clause
            // token labels: 
            // rule labels: retval
            // token list labels: 
            // rule list labels: 
            // wildcard labels: 
            if ( state.backtracking==0 ) {

            retval.tree = root_0;
            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

            root_0 = (Object)adaptor.nil();
            // 706:9: -> ^( STATIC_RETURNING ( ^( EXPR expression ) )+ into_clause )
            {
                // PLSQL_DMLParser.g:706:12: ^( STATIC_RETURNING ( ^( EXPR expression ) )+ into_clause )
                {
                Object root_1 = (Object)adaptor.nil();
                root_1 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(STATIC_RETURNING, "STATIC_RETURNING")
                , root_1);

                if ( !(stream_expression.hasNext()) ) {
                    throw new RewriteEarlyExitException();
                }
                while ( stream_expression.hasNext() ) {
                    // PLSQL_DMLParser.g:706:31: ^( EXPR expression )
                    {
                    Object root_2 = (Object)adaptor.nil();
                    root_2 = (Object)adaptor.becomeRoot(
                    (Object)adaptor.create(EXPR, "EXPR")
                    , root_2);

                    adaptor.addChild(root_2, stream_expression.nextTree());

                    adaptor.addChild(root_1, root_2);
                    }

                }
                stream_expression.reset();

                adaptor.addChild(root_1, stream_into_clause.nextTree());

                adaptor.addChild(root_0, root_1);
                }

            }


            retval.tree = root_0;
            }

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "static_returning_clause"


    public static class error_logging_clause_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "error_logging_clause"
    // PLSQL_DMLParser.g:709:1: error_logging_clause : log_key errors_key ( error_logging_into_part )? ( ( LEFT_PAREN )=> expression_wrapper )? ( error_logging_reject_part )? -> ^( log_key ( error_logging_into_part )? ( expression_wrapper )? ( error_logging_reject_part )? ) ;
    public final PLSQLParser_PLSQL_DMLParser.error_logging_clause_return error_logging_clause() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.error_logging_clause_return retval = new PLSQLParser_PLSQL_DMLParser.error_logging_clause_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        PLSQLParser_PLSQLKeys.log_key_return log_key459 =null;

        PLSQLParser_PLSQLKeys.errors_key_return errors_key460 =null;

        PLSQLParser_PLSQL_DMLParser.error_logging_into_part_return error_logging_into_part461 =null;

        PLSQLParser_PLSQL_DMLParser.expression_wrapper_return expression_wrapper462 =null;

        PLSQLParser_PLSQL_DMLParser.error_logging_reject_part_return error_logging_reject_part463 =null;


        RewriteRuleSubtreeStream stream_error_logging_reject_part=new RewriteRuleSubtreeStream(adaptor,"rule error_logging_reject_part");
        RewriteRuleSubtreeStream stream_expression_wrapper=new RewriteRuleSubtreeStream(adaptor,"rule expression_wrapper");
        RewriteRuleSubtreeStream stream_errors_key=new RewriteRuleSubtreeStream(adaptor,"rule errors_key");
        RewriteRuleSubtreeStream stream_error_logging_into_part=new RewriteRuleSubtreeStream(adaptor,"rule error_logging_into_part");
        RewriteRuleSubtreeStream stream_log_key=new RewriteRuleSubtreeStream(adaptor,"rule log_key");
        try {
            // PLSQL_DMLParser.g:710:5: ( log_key errors_key ( error_logging_into_part )? ( ( LEFT_PAREN )=> expression_wrapper )? ( error_logging_reject_part )? -> ^( log_key ( error_logging_into_part )? ( expression_wrapper )? ( error_logging_reject_part )? ) )
            // PLSQL_DMLParser.g:710:10: log_key errors_key ( error_logging_into_part )? ( ( LEFT_PAREN )=> expression_wrapper )? ( error_logging_reject_part )?
            {
            pushFollow(FOLLOW_log_key_in_error_logging_clause6195);
            log_key459=gPLSQLParser.log_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_log_key.add(log_key459.getTree());

            pushFollow(FOLLOW_errors_key_in_error_logging_clause6197);
            errors_key460=gPLSQLParser.errors_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_errors_key.add(errors_key460.getTree());

            // PLSQL_DMLParser.g:711:9: ( error_logging_into_part )?
            int alt151=2;
            alt151 = dfa151.predict(input);
            switch (alt151) {
                case 1 :
                    // PLSQL_DMLParser.g:711:9: error_logging_into_part
                    {
                    pushFollow(FOLLOW_error_logging_into_part_in_error_logging_clause6208);
                    error_logging_into_part461=error_logging_into_part();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_error_logging_into_part.add(error_logging_into_part461.getTree());

                    }
                    break;

            }


            // PLSQL_DMLParser.g:712:9: ( ( LEFT_PAREN )=> expression_wrapper )?
            int alt152=2;
            int LA152_0 = input.LA(1);

            if ( (LA152_0==SQL92_RESERVED_NOT) && (synpred13_PLSQL_DMLParser())) {
                alt152=1;
            }
            else if ( (LA152_0==MINUS_SIGN) && (synpred13_PLSQL_DMLParser())) {
                alt152=1;
            }
            else if ( (LA152_0==PLUS_SIGN) && (synpred13_PLSQL_DMLParser())) {
                alt152=1;
            }
            else if ( (LA152_0==SQL92_RESERVED_PRIOR) && (synpred13_PLSQL_DMLParser())) {
                alt152=1;
            }
            else if ( (LA152_0==REGULAR_ID) ) {
                int LA152_5 = input.LA(2);

                if ( (synpred13_PLSQL_DMLParser()) ) {
                    alt152=1;
                }
            }
            else if ( (LA152_0==SQL92_RESERVED_DISTINCT) && (synpred13_PLSQL_DMLParser())) {
                alt152=1;
            }
            else if ( (LA152_0==SQL92_RESERVED_ALL) && (synpred13_PLSQL_DMLParser())) {
                alt152=1;
            }
            else if ( (LA152_0==DELIMITED_ID) ) {
                int LA152_8 = input.LA(2);

                if ( (synpred13_PLSQL_DMLParser()) ) {
                    alt152=1;
                }
            }
            else if ( (LA152_0==SQL92_RESERVED_CASE) ) {
                int LA152_9 = input.LA(2);

                if ( (((synpred13_PLSQL_DMLParser()&&synpred13_PLSQL_DMLParser())&&((input.LA(1) == SQL92_RESERVED_CASE || input.LA(2) == SQL92_RESERVED_CASE)))) ) {
                    alt152=1;
                }
            }
            else if ( (LA152_0==SQL92_RESERVED_EXISTS) && (synpred13_PLSQL_DMLParser())) {
                alt152=1;
            }
            else if ( (LA152_0==SQL92_RESERVED_ANY) && (synpred13_PLSQL_DMLParser())) {
                alt152=1;
            }
            else if ( (LA152_0==APPROXIMATE_NUM_LIT||LA152_0==EXACT_NUM_LIT||LA152_0==UNSIGNED_INTEGER) && (synpred13_PLSQL_DMLParser())) {
                alt152=1;
            }
            else if ( (LA152_0==CHAR_STRING) && (synpred13_PLSQL_DMLParser())) {
                alt152=1;
            }
            else if ( (LA152_0==SQL92_RESERVED_NULL) && (synpred13_PLSQL_DMLParser())) {
                alt152=1;
            }
            else if ( (LA152_0==SQL92_RESERVED_TRUE) && (synpred13_PLSQL_DMLParser())) {
                alt152=1;
            }
            else if ( (LA152_0==SQL92_RESERVED_FALSE) && (synpred13_PLSQL_DMLParser())) {
                alt152=1;
            }
            else if ( (LA152_0==SQL92_RESERVED_DEFAULT) && (synpred13_PLSQL_DMLParser())) {
                alt152=1;
            }
            else if ( (LA152_0==INTRODUCER) && (synpred13_PLSQL_DMLParser())) {
                alt152=1;
            }
            else if ( (LA152_0==COLON) && (synpred13_PLSQL_DMLParser())) {
                alt152=1;
            }
            else if ( (LA152_0==LEFT_PAREN) ) {
                int LA152_20 = input.LA(2);

                if ( (synpred13_PLSQL_DMLParser()) ) {
                    alt152=1;
                }
            }
            switch (alt152) {
                case 1 :
                    // PLSQL_DMLParser.g:712:10: ( LEFT_PAREN )=> expression_wrapper
                    {
                    pushFollow(FOLLOW_expression_wrapper_in_error_logging_clause6225);
                    expression_wrapper462=expression_wrapper();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_expression_wrapper.add(expression_wrapper462.getTree());

                    }
                    break;

            }


            // PLSQL_DMLParser.g:713:9: ( error_logging_reject_part )?
            int alt153=2;
            int LA153_0 = input.LA(1);

            if ( (LA153_0==REGULAR_ID) ) {
                int LA153_1 = input.LA(2);

                if ( (LA153_1==REGULAR_ID) && ((input.LT(1).getText().equalsIgnoreCase("reject")))) {
                    alt153=1;
                }
            }
            switch (alt153) {
                case 1 :
                    // PLSQL_DMLParser.g:713:9: error_logging_reject_part
                    {
                    pushFollow(FOLLOW_error_logging_reject_part_in_error_logging_clause6237);
                    error_logging_reject_part463=error_logging_reject_part();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_error_logging_reject_part.add(error_logging_reject_part463.getTree());

                    }
                    break;

            }


            // AST REWRITE
            // elements: error_logging_reject_part, expression_wrapper, log_key, error_logging_into_part
            // token labels: 
            // rule labels: retval
            // token list labels: 
            // rule list labels: 
            // wildcard labels: 
            if ( state.backtracking==0 ) {

            retval.tree = root_0;
            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

            root_0 = (Object)adaptor.nil();
            // 714:9: -> ^( log_key ( error_logging_into_part )? ( expression_wrapper )? ( error_logging_reject_part )? )
            {
                // PLSQL_DMLParser.g:714:12: ^( log_key ( error_logging_into_part )? ( expression_wrapper )? ( error_logging_reject_part )? )
                {
                Object root_1 = (Object)adaptor.nil();
                root_1 = (Object)adaptor.becomeRoot(stream_log_key.nextNode(), root_1);

                // PLSQL_DMLParser.g:714:22: ( error_logging_into_part )?
                if ( stream_error_logging_into_part.hasNext() ) {
                    adaptor.addChild(root_1, stream_error_logging_into_part.nextTree());

                }
                stream_error_logging_into_part.reset();

                // PLSQL_DMLParser.g:714:47: ( expression_wrapper )?
                if ( stream_expression_wrapper.hasNext() ) {
                    adaptor.addChild(root_1, stream_expression_wrapper.nextTree());

                }
                stream_expression_wrapper.reset();

                // PLSQL_DMLParser.g:714:67: ( error_logging_reject_part )?
                if ( stream_error_logging_reject_part.hasNext() ) {
                    adaptor.addChild(root_1, stream_error_logging_reject_part.nextTree());

                }
                stream_error_logging_reject_part.reset();

                adaptor.addChild(root_0, root_1);
                }

            }


            retval.tree = root_0;
            }

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "error_logging_clause"


    public static class error_logging_into_part_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "error_logging_into_part"
    // PLSQL_DMLParser.g:717:1: error_logging_into_part : into_key ^ tableview_name ;
    public final PLSQLParser_PLSQL_DMLParser.error_logging_into_part_return error_logging_into_part() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.error_logging_into_part_return retval = new PLSQLParser_PLSQL_DMLParser.error_logging_into_part_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        PLSQLParser_PLSQLKeys.into_key_return into_key464 =null;

        PLSQLParser_PLSQLCommons.tableview_name_return tableview_name465 =null;



        try {
            // PLSQL_DMLParser.g:718:5: ( into_key ^ tableview_name )
            // PLSQL_DMLParser.g:718:10: into_key ^ tableview_name
            {
            root_0 = (Object)adaptor.nil();


            pushFollow(FOLLOW_into_key_in_error_logging_into_part6281);
            into_key464=gPLSQLParser.into_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) root_0 = (Object)adaptor.becomeRoot(into_key464.getTree(), root_0);

            pushFollow(FOLLOW_tableview_name_in_error_logging_into_part6284);
            tableview_name465=gPLSQLParser.tableview_name();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) adaptor.addChild(root_0, tableview_name465.getTree());

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "error_logging_into_part"


    public static class error_logging_reject_part_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "error_logging_reject_part"
    // PLSQL_DMLParser.g:721:1: error_logging_reject_part : reject_key ^ limit_key ! ( ( unlimited_key )=> unlimited_key | expression_wrapper ) ;
    public final PLSQLParser_PLSQL_DMLParser.error_logging_reject_part_return error_logging_reject_part() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.error_logging_reject_part_return retval = new PLSQLParser_PLSQL_DMLParser.error_logging_reject_part_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        PLSQLParser_PLSQLKeys.reject_key_return reject_key466 =null;

        PLSQLParser_PLSQLKeys.limit_key_return limit_key467 =null;

        PLSQLParser_PLSQLKeys.unlimited_key_return unlimited_key468 =null;

        PLSQLParser_PLSQL_DMLParser.expression_wrapper_return expression_wrapper469 =null;



        try {
            // PLSQL_DMLParser.g:722:5: ( reject_key ^ limit_key ! ( ( unlimited_key )=> unlimited_key | expression_wrapper ) )
            // PLSQL_DMLParser.g:722:10: reject_key ^ limit_key ! ( ( unlimited_key )=> unlimited_key | expression_wrapper )
            {
            root_0 = (Object)adaptor.nil();


            pushFollow(FOLLOW_reject_key_in_error_logging_reject_part6304);
            reject_key466=gPLSQLParser.reject_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) root_0 = (Object)adaptor.becomeRoot(reject_key466.getTree(), root_0);

            pushFollow(FOLLOW_limit_key_in_error_logging_reject_part6307);
            limit_key467=gPLSQLParser.limit_key();

            state._fsp--;
            if (state.failed) return retval;

            // PLSQL_DMLParser.g:722:33: ( ( unlimited_key )=> unlimited_key | expression_wrapper )
            int alt154=2;
            int LA154_0 = input.LA(1);

            if ( (LA154_0==REGULAR_ID) ) {
                int LA154_1 = input.LA(2);

                if ( ((((input.LT(1).getText().equalsIgnoreCase("unlimited"))&&(input.LT(1).getText().equalsIgnoreCase("unlimited")))&&synpred14_PLSQL_DMLParser())) ) {
                    alt154=1;
                }
                else if ( (true) ) {
                    alt154=2;
                }
                else {
                    if (state.backtracking>0) {state.failed=true; return retval;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 154, 1, input);

                    throw nvae;

                }
            }
            else if ( (LA154_0==APPROXIMATE_NUM_LIT||(LA154_0 >= CHAR_STRING && LA154_0 <= COLON)||LA154_0==DELIMITED_ID||LA154_0==EXACT_NUM_LIT||LA154_0==INTRODUCER||LA154_0==LEFT_PAREN||LA154_0==MINUS_SIGN||LA154_0==PLUS_SIGN||LA154_0==SQL92_RESERVED_ALL||LA154_0==SQL92_RESERVED_ANY||LA154_0==SQL92_RESERVED_CASE||LA154_0==SQL92_RESERVED_DEFAULT||LA154_0==SQL92_RESERVED_DISTINCT||(LA154_0 >= SQL92_RESERVED_EXISTS && LA154_0 <= SQL92_RESERVED_FALSE)||(LA154_0 >= SQL92_RESERVED_NOT && LA154_0 <= SQL92_RESERVED_NULL)||LA154_0==SQL92_RESERVED_PRIOR||LA154_0==SQL92_RESERVED_TRUE||LA154_0==UNSIGNED_INTEGER) ) {
                alt154=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return retval;}
                NoViableAltException nvae =
                    new NoViableAltException("", 154, 0, input);

                throw nvae;

            }
            switch (alt154) {
                case 1 :
                    // PLSQL_DMLParser.g:722:34: ( unlimited_key )=> unlimited_key
                    {
                    pushFollow(FOLLOW_unlimited_key_in_error_logging_reject_part6315);
                    unlimited_key468=gPLSQLParser.unlimited_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, unlimited_key468.getTree());

                    }
                    break;
                case 2 :
                    // PLSQL_DMLParser.g:722:65: expression_wrapper
                    {
                    pushFollow(FOLLOW_expression_wrapper_in_error_logging_reject_part6317);
                    expression_wrapper469=expression_wrapper();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, expression_wrapper469.getTree());

                    }
                    break;

            }


            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "error_logging_reject_part"


    public static class dml_table_expression_clause_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "dml_table_expression_clause"
    // PLSQL_DMLParser.g:725:1: dml_table_expression_clause : ( table_collection_expression -> ^( TABLE_EXPRESSION ^( COLLECTION_MODE table_collection_expression ) ) | LEFT_PAREN select_statement ( subquery_restriction_clause )? RIGHT_PAREN -> ^( TABLE_EXPRESSION ^( SELECT_MODE select_statement ( subquery_restriction_clause )? ) ) | tableview_name ( sample_clause )? -> ^( TABLE_EXPRESSION ^( DIRECT_MODE tableview_name ( sample_clause )? ) ) );
    public final PLSQLParser_PLSQL_DMLParser.dml_table_expression_clause_return dml_table_expression_clause() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.dml_table_expression_clause_return retval = new PLSQLParser_PLSQL_DMLParser.dml_table_expression_clause_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token LEFT_PAREN471=null;
        Token RIGHT_PAREN474=null;
        PLSQLParser_PLSQL_DMLParser.table_collection_expression_return table_collection_expression470 =null;

        PLSQLParser_PLSQL_DMLParser.select_statement_return select_statement472 =null;

        PLSQLParser_PLSQL_DMLParser.subquery_restriction_clause_return subquery_restriction_clause473 =null;

        PLSQLParser_PLSQLCommons.tableview_name_return tableview_name475 =null;

        PLSQLParser_PLSQL_DMLParser.sample_clause_return sample_clause476 =null;


        Object LEFT_PAREN471_tree=null;
        Object RIGHT_PAREN474_tree=null;
        RewriteRuleTokenStream stream_LEFT_PAREN=new RewriteRuleTokenStream(adaptor,"token LEFT_PAREN");
        RewriteRuleTokenStream stream_RIGHT_PAREN=new RewriteRuleTokenStream(adaptor,"token RIGHT_PAREN");
        RewriteRuleSubtreeStream stream_sample_clause=new RewriteRuleSubtreeStream(adaptor,"rule sample_clause");
        RewriteRuleSubtreeStream stream_select_statement=new RewriteRuleSubtreeStream(adaptor,"rule select_statement");
        RewriteRuleSubtreeStream stream_table_collection_expression=new RewriteRuleSubtreeStream(adaptor,"rule table_collection_expression");
        RewriteRuleSubtreeStream stream_tableview_name=new RewriteRuleSubtreeStream(adaptor,"rule tableview_name");
        RewriteRuleSubtreeStream stream_subquery_restriction_clause=new RewriteRuleSubtreeStream(adaptor,"rule subquery_restriction_clause");
        try {
            // PLSQL_DMLParser.g:726:5: ( table_collection_expression -> ^( TABLE_EXPRESSION ^( COLLECTION_MODE table_collection_expression ) ) | LEFT_PAREN select_statement ( subquery_restriction_clause )? RIGHT_PAREN -> ^( TABLE_EXPRESSION ^( SELECT_MODE select_statement ( subquery_restriction_clause )? ) ) | tableview_name ( sample_clause )? -> ^( TABLE_EXPRESSION ^( DIRECT_MODE tableview_name ( sample_clause )? ) ) )
            int alt157=3;
            switch ( input.LA(1) ) {
            case SQL92_RESERVED_TABLE:
                {
                alt157=1;
                }
                break;
            case LEFT_PAREN:
                {
                alt157=2;
                }
                break;
            case DELIMITED_ID:
            case INTRODUCER:
            case REGULAR_ID:
                {
                alt157=3;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return retval;}
                NoViableAltException nvae =
                    new NoViableAltException("", 157, 0, input);

                throw nvae;

            }

            switch (alt157) {
                case 1 :
                    // PLSQL_DMLParser.g:726:10: table_collection_expression
                    {
                    pushFollow(FOLLOW_table_collection_expression_in_dml_table_expression_clause6338);
                    table_collection_expression470=table_collection_expression();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_table_collection_expression.add(table_collection_expression470.getTree());

                    // AST REWRITE
                    // elements: table_collection_expression
                    // token labels: 
                    // rule labels: retval
                    // token list labels: 
                    // rule list labels: 
                    // wildcard labels: 
                    if ( state.backtracking==0 ) {

                    retval.tree = root_0;
                    RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

                    root_0 = (Object)adaptor.nil();
                    // 726:38: -> ^( TABLE_EXPRESSION ^( COLLECTION_MODE table_collection_expression ) )
                    {
                        // PLSQL_DMLParser.g:726:41: ^( TABLE_EXPRESSION ^( COLLECTION_MODE table_collection_expression ) )
                        {
                        Object root_1 = (Object)adaptor.nil();
                        root_1 = (Object)adaptor.becomeRoot(
                        (Object)adaptor.create(TABLE_EXPRESSION, "TABLE_EXPRESSION")
                        , root_1);

                        // PLSQL_DMLParser.g:726:60: ^( COLLECTION_MODE table_collection_expression )
                        {
                        Object root_2 = (Object)adaptor.nil();
                        root_2 = (Object)adaptor.becomeRoot(
                        (Object)adaptor.create(COLLECTION_MODE, "COLLECTION_MODE")
                        , root_2);

                        adaptor.addChild(root_2, stream_table_collection_expression.nextTree());

                        adaptor.addChild(root_1, root_2);
                        }

                        adaptor.addChild(root_0, root_1);
                        }

                    }


                    retval.tree = root_0;
                    }

                    }
                    break;
                case 2 :
                    // PLSQL_DMLParser.g:727:10: LEFT_PAREN select_statement ( subquery_restriction_clause )? RIGHT_PAREN
                    {
                    LEFT_PAREN471=(Token)match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_dml_table_expression_clause6361); if (state.failed) return retval; 
                    if ( state.backtracking==0 ) stream_LEFT_PAREN.add(LEFT_PAREN471);


                    pushFollow(FOLLOW_select_statement_in_dml_table_expression_clause6363);
                    select_statement472=select_statement();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_select_statement.add(select_statement472.getTree());

                    // PLSQL_DMLParser.g:727:38: ( subquery_restriction_clause )?
                    int alt155=2;
                    int LA155_0 = input.LA(1);

                    if ( (LA155_0==SQL92_RESERVED_WITH) ) {
                        alt155=1;
                    }
                    switch (alt155) {
                        case 1 :
                            // PLSQL_DMLParser.g:727:38: subquery_restriction_clause
                            {
                            pushFollow(FOLLOW_subquery_restriction_clause_in_dml_table_expression_clause6365);
                            subquery_restriction_clause473=subquery_restriction_clause();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) stream_subquery_restriction_clause.add(subquery_restriction_clause473.getTree());

                            }
                            break;

                    }


                    RIGHT_PAREN474=(Token)match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_dml_table_expression_clause6368); if (state.failed) return retval; 
                    if ( state.backtracking==0 ) stream_RIGHT_PAREN.add(RIGHT_PAREN474);


                    // AST REWRITE
                    // elements: select_statement, subquery_restriction_clause
                    // token labels: 
                    // rule labels: retval
                    // token list labels: 
                    // rule list labels: 
                    // wildcard labels: 
                    if ( state.backtracking==0 ) {

                    retval.tree = root_0;
                    RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

                    root_0 = (Object)adaptor.nil();
                    // 727:79: -> ^( TABLE_EXPRESSION ^( SELECT_MODE select_statement ( subquery_restriction_clause )? ) )
                    {
                        // PLSQL_DMLParser.g:727:82: ^( TABLE_EXPRESSION ^( SELECT_MODE select_statement ( subquery_restriction_clause )? ) )
                        {
                        Object root_1 = (Object)adaptor.nil();
                        root_1 = (Object)adaptor.becomeRoot(
                        (Object)adaptor.create(TABLE_EXPRESSION, "TABLE_EXPRESSION")
                        , root_1);

                        // PLSQL_DMLParser.g:727:101: ^( SELECT_MODE select_statement ( subquery_restriction_clause )? )
                        {
                        Object root_2 = (Object)adaptor.nil();
                        root_2 = (Object)adaptor.becomeRoot(
                        (Object)adaptor.create(SELECT_MODE, "SELECT_MODE")
                        , root_2);

                        adaptor.addChild(root_2, stream_select_statement.nextTree());

                        // PLSQL_DMLParser.g:727:132: ( subquery_restriction_clause )?
                        if ( stream_subquery_restriction_clause.hasNext() ) {
                            adaptor.addChild(root_2, stream_subquery_restriction_clause.nextTree());

                        }
                        stream_subquery_restriction_clause.reset();

                        adaptor.addChild(root_1, root_2);
                        }

                        adaptor.addChild(root_0, root_1);
                        }

                    }


                    retval.tree = root_0;
                    }

                    }
                    break;
                case 3 :
                    // PLSQL_DMLParser.g:728:10: tableview_name ( sample_clause )?
                    {
                    pushFollow(FOLLOW_tableview_name_in_dml_table_expression_clause6394);
                    tableview_name475=gPLSQLParser.tableview_name();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_tableview_name.add(tableview_name475.getTree());

                    // PLSQL_DMLParser.g:728:25: ( sample_clause )?
                    int alt156=2;
                    int LA156_0 = input.LA(1);

                    if ( (LA156_0==REGULAR_ID) ) {
                        int LA156_1 = input.LA(2);

                        if ( ((input.LT(1).getText().equalsIgnoreCase("sample"))) ) {
                            alt156=1;
                        }
                    }
                    switch (alt156) {
                        case 1 :
                            // PLSQL_DMLParser.g:728:25: sample_clause
                            {
                            pushFollow(FOLLOW_sample_clause_in_dml_table_expression_clause6396);
                            sample_clause476=sample_clause();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) stream_sample_clause.add(sample_clause476.getTree());

                            }
                            break;

                    }


                    // AST REWRITE
                    // elements: sample_clause, tableview_name
                    // token labels: 
                    // rule labels: retval
                    // token list labels: 
                    // rule list labels: 
                    // wildcard labels: 
                    if ( state.backtracking==0 ) {

                    retval.tree = root_0;
                    RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

                    root_0 = (Object)adaptor.nil();
                    // 728:40: -> ^( TABLE_EXPRESSION ^( DIRECT_MODE tableview_name ( sample_clause )? ) )
                    {
                        // PLSQL_DMLParser.g:728:43: ^( TABLE_EXPRESSION ^( DIRECT_MODE tableview_name ( sample_clause )? ) )
                        {
                        Object root_1 = (Object)adaptor.nil();
                        root_1 = (Object)adaptor.becomeRoot(
                        (Object)adaptor.create(TABLE_EXPRESSION, "TABLE_EXPRESSION")
                        , root_1);

                        // PLSQL_DMLParser.g:728:62: ^( DIRECT_MODE tableview_name ( sample_clause )? )
                        {
                        Object root_2 = (Object)adaptor.nil();
                        root_2 = (Object)adaptor.becomeRoot(
                        (Object)adaptor.create(DIRECT_MODE, "DIRECT_MODE")
                        , root_2);

                        adaptor.addChild(root_2, stream_tableview_name.nextTree());

                        // PLSQL_DMLParser.g:728:91: ( sample_clause )?
                        if ( stream_sample_clause.hasNext() ) {
                            adaptor.addChild(root_2, stream_sample_clause.nextTree());

                        }
                        stream_sample_clause.reset();

                        adaptor.addChild(root_1, root_2);
                        }

                        adaptor.addChild(root_0, root_1);
                        }

                    }


                    retval.tree = root_0;
                    }

                    }
                    break;

            }
            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "dml_table_expression_clause"


    public static class table_collection_expression_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "table_collection_expression"
    // PLSQL_DMLParser.g:731:1: table_collection_expression : table_key LEFT_PAREN expression RIGHT_PAREN ( LEFT_PAREN PLUS_SIGN RIGHT_PAREN )? -> ^( EXPR expression ) ( PLUS_SIGN )? ;
    public final PLSQLParser_PLSQL_DMLParser.table_collection_expression_return table_collection_expression() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.table_collection_expression_return retval = new PLSQLParser_PLSQL_DMLParser.table_collection_expression_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token LEFT_PAREN478=null;
        Token RIGHT_PAREN480=null;
        Token LEFT_PAREN481=null;
        Token PLUS_SIGN482=null;
        Token RIGHT_PAREN483=null;
        PLSQLParser_PLSQLKeys.table_key_return table_key477 =null;

        PLSQLParser_PLSQL_DMLParser.expression_return expression479 =null;


        Object LEFT_PAREN478_tree=null;
        Object RIGHT_PAREN480_tree=null;
        Object LEFT_PAREN481_tree=null;
        Object PLUS_SIGN482_tree=null;
        Object RIGHT_PAREN483_tree=null;
        RewriteRuleTokenStream stream_LEFT_PAREN=new RewriteRuleTokenStream(adaptor,"token LEFT_PAREN");
        RewriteRuleTokenStream stream_RIGHT_PAREN=new RewriteRuleTokenStream(adaptor,"token RIGHT_PAREN");
        RewriteRuleTokenStream stream_PLUS_SIGN=new RewriteRuleTokenStream(adaptor,"token PLUS_SIGN");
        RewriteRuleSubtreeStream stream_expression=new RewriteRuleSubtreeStream(adaptor,"rule expression");
        RewriteRuleSubtreeStream stream_table_key=new RewriteRuleSubtreeStream(adaptor,"rule table_key");
        try {
            // PLSQL_DMLParser.g:732:5: ( table_key LEFT_PAREN expression RIGHT_PAREN ( LEFT_PAREN PLUS_SIGN RIGHT_PAREN )? -> ^( EXPR expression ) ( PLUS_SIGN )? )
            // PLSQL_DMLParser.g:732:10: table_key LEFT_PAREN expression RIGHT_PAREN ( LEFT_PAREN PLUS_SIGN RIGHT_PAREN )?
            {
            pushFollow(FOLLOW_table_key_in_table_collection_expression6432);
            table_key477=gPLSQLParser.table_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_table_key.add(table_key477.getTree());

            LEFT_PAREN478=(Token)match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_table_collection_expression6442); if (state.failed) return retval; 
            if ( state.backtracking==0 ) stream_LEFT_PAREN.add(LEFT_PAREN478);


            pushFollow(FOLLOW_expression_in_table_collection_expression6444);
            expression479=expression();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_expression.add(expression479.getTree());

            RIGHT_PAREN480=(Token)match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_table_collection_expression6446); if (state.failed) return retval; 
            if ( state.backtracking==0 ) stream_RIGHT_PAREN.add(RIGHT_PAREN480);


            // PLSQL_DMLParser.g:734:9: ( LEFT_PAREN PLUS_SIGN RIGHT_PAREN )?
            int alt158=2;
            int LA158_0 = input.LA(1);

            if ( (LA158_0==LEFT_PAREN) ) {
                int LA158_1 = input.LA(2);

                if ( (LA158_1==PLUS_SIGN) ) {
                    alt158=1;
                }
            }
            switch (alt158) {
                case 1 :
                    // PLSQL_DMLParser.g:734:10: LEFT_PAREN PLUS_SIGN RIGHT_PAREN
                    {
                    LEFT_PAREN481=(Token)match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_table_collection_expression6459); if (state.failed) return retval; 
                    if ( state.backtracking==0 ) stream_LEFT_PAREN.add(LEFT_PAREN481);


                    PLUS_SIGN482=(Token)match(input,PLUS_SIGN,FOLLOW_PLUS_SIGN_in_table_collection_expression6461); if (state.failed) return retval; 
                    if ( state.backtracking==0 ) stream_PLUS_SIGN.add(PLUS_SIGN482);


                    RIGHT_PAREN483=(Token)match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_table_collection_expression6463); if (state.failed) return retval; 
                    if ( state.backtracking==0 ) stream_RIGHT_PAREN.add(RIGHT_PAREN483);


                    }
                    break;

            }


            // AST REWRITE
            // elements: expression, PLUS_SIGN
            // token labels: 
            // rule labels: retval
            // token list labels: 
            // rule list labels: 
            // wildcard labels: 
            if ( state.backtracking==0 ) {

            retval.tree = root_0;
            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

            root_0 = (Object)adaptor.nil();
            // 735:9: -> ^( EXPR expression ) ( PLUS_SIGN )?
            {
                // PLSQL_DMLParser.g:735:12: ^( EXPR expression )
                {
                Object root_1 = (Object)adaptor.nil();
                root_1 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(EXPR, "EXPR")
                , root_1);

                adaptor.addChild(root_1, stream_expression.nextTree());

                adaptor.addChild(root_0, root_1);
                }

                // PLSQL_DMLParser.g:735:31: ( PLUS_SIGN )?
                if ( stream_PLUS_SIGN.hasNext() ) {
                    adaptor.addChild(root_0, 
                    stream_PLUS_SIGN.nextNode()
                    );

                }
                stream_PLUS_SIGN.reset();

            }


            retval.tree = root_0;
            }

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "table_collection_expression"


    public static class subquery_restriction_clause_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "subquery_restriction_clause"
    // PLSQL_DMLParser.g:738:1: subquery_restriction_clause : with_key ( read_key only_key | check_key option_key ( constraint_key constraint_name )? ) -> ^( with_key ( read_key )? ( check_key )? ( constraint_name )? ) ;
    public final PLSQLParser_PLSQL_DMLParser.subquery_restriction_clause_return subquery_restriction_clause() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.subquery_restriction_clause_return retval = new PLSQLParser_PLSQL_DMLParser.subquery_restriction_clause_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        PLSQLParser_PLSQLKeys.with_key_return with_key484 =null;

        PLSQLParser_PLSQLKeys.read_key_return read_key485 =null;

        PLSQLParser_PLSQLKeys.only_key_return only_key486 =null;

        PLSQLParser_PLSQLKeys.check_key_return check_key487 =null;

        PLSQLParser_PLSQLKeys.option_key_return option_key488 =null;

        PLSQLParser_PLSQLKeys.constraint_key_return constraint_key489 =null;

        PLSQLParser_PLSQLCommons.constraint_name_return constraint_name490 =null;


        RewriteRuleSubtreeStream stream_with_key=new RewriteRuleSubtreeStream(adaptor,"rule with_key");
        RewriteRuleSubtreeStream stream_constraint_key=new RewriteRuleSubtreeStream(adaptor,"rule constraint_key");
        RewriteRuleSubtreeStream stream_check_key=new RewriteRuleSubtreeStream(adaptor,"rule check_key");
        RewriteRuleSubtreeStream stream_option_key=new RewriteRuleSubtreeStream(adaptor,"rule option_key");
        RewriteRuleSubtreeStream stream_constraint_name=new RewriteRuleSubtreeStream(adaptor,"rule constraint_name");
        RewriteRuleSubtreeStream stream_read_key=new RewriteRuleSubtreeStream(adaptor,"rule read_key");
        RewriteRuleSubtreeStream stream_only_key=new RewriteRuleSubtreeStream(adaptor,"rule only_key");
        try {
            // PLSQL_DMLParser.g:739:5: ( with_key ( read_key only_key | check_key option_key ( constraint_key constraint_name )? ) -> ^( with_key ( read_key )? ( check_key )? ( constraint_name )? ) )
            // PLSQL_DMLParser.g:739:10: with_key ( read_key only_key | check_key option_key ( constraint_key constraint_name )? )
            {
            pushFollow(FOLLOW_with_key_in_subquery_restriction_clause6505);
            with_key484=gPLSQLParser.with_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_with_key.add(with_key484.getTree());

            // PLSQL_DMLParser.g:740:5: ( read_key only_key | check_key option_key ( constraint_key constraint_name )? )
            int alt160=2;
            int LA160_0 = input.LA(1);

            if ( (LA160_0==REGULAR_ID) && ((input.LT(1).getText().equalsIgnoreCase("read")))) {
                alt160=1;
            }
            else if ( (LA160_0==SQL92_RESERVED_CHECK) ) {
                alt160=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return retval;}
                NoViableAltException nvae =
                    new NoViableAltException("", 160, 0, input);

                throw nvae;

            }
            switch (alt160) {
                case 1 :
                    // PLSQL_DMLParser.g:740:10: read_key only_key
                    {
                    pushFollow(FOLLOW_read_key_in_subquery_restriction_clause6516);
                    read_key485=gPLSQLParser.read_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_read_key.add(read_key485.getTree());

                    pushFollow(FOLLOW_only_key_in_subquery_restriction_clause6518);
                    only_key486=gPLSQLParser.only_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_only_key.add(only_key486.getTree());

                    }
                    break;
                case 2 :
                    // PLSQL_DMLParser.g:741:10: check_key option_key ( constraint_key constraint_name )?
                    {
                    pushFollow(FOLLOW_check_key_in_subquery_restriction_clause6529);
                    check_key487=gPLSQLParser.check_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_check_key.add(check_key487.getTree());

                    pushFollow(FOLLOW_option_key_in_subquery_restriction_clause6531);
                    option_key488=gPLSQLParser.option_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_option_key.add(option_key488.getTree());

                    // PLSQL_DMLParser.g:741:31: ( constraint_key constraint_name )?
                    int alt159=2;
                    int LA159_0 = input.LA(1);

                    if ( (LA159_0==REGULAR_ID) && ((input.LT(1).getText().equalsIgnoreCase("constraint")))) {
                        alt159=1;
                    }
                    switch (alt159) {
                        case 1 :
                            // PLSQL_DMLParser.g:741:32: constraint_key constraint_name
                            {
                            pushFollow(FOLLOW_constraint_key_in_subquery_restriction_clause6534);
                            constraint_key489=gPLSQLParser.constraint_key();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) stream_constraint_key.add(constraint_key489.getTree());

                            pushFollow(FOLLOW_constraint_name_in_subquery_restriction_clause6536);
                            constraint_name490=gPLSQLParser.constraint_name();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) stream_constraint_name.add(constraint_name490.getTree());

                            }
                            break;

                    }


                    }
                    break;

            }


            // AST REWRITE
            // elements: read_key, with_key, check_key, constraint_name
            // token labels: 
            // rule labels: retval
            // token list labels: 
            // rule list labels: 
            // wildcard labels: 
            if ( state.backtracking==0 ) {

            retval.tree = root_0;
            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

            root_0 = (Object)adaptor.nil();
            // 743:9: -> ^( with_key ( read_key )? ( check_key )? ( constraint_name )? )
            {
                // PLSQL_DMLParser.g:743:12: ^( with_key ( read_key )? ( check_key )? ( constraint_name )? )
                {
                Object root_1 = (Object)adaptor.nil();
                root_1 = (Object)adaptor.becomeRoot(stream_with_key.nextNode(), root_1);

                // PLSQL_DMLParser.g:743:23: ( read_key )?
                if ( stream_read_key.hasNext() ) {
                    adaptor.addChild(root_1, stream_read_key.nextTree());

                }
                stream_read_key.reset();

                // PLSQL_DMLParser.g:743:33: ( check_key )?
                if ( stream_check_key.hasNext() ) {
                    adaptor.addChild(root_1, stream_check_key.nextTree());

                }
                stream_check_key.reset();

                // PLSQL_DMLParser.g:743:44: ( constraint_name )?
                if ( stream_constraint_name.hasNext() ) {
                    adaptor.addChild(root_1, stream_constraint_name.nextTree());

                }
                stream_constraint_name.reset();

                adaptor.addChild(root_0, root_1);
                }

            }


            retval.tree = root_0;
            }

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "subquery_restriction_clause"


    public static class sample_clause_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "sample_clause"
    // PLSQL_DMLParser.g:746:1: sample_clause : sample_key ( block_key )? LEFT_PAREN expression RIGHT_PAREN ( seed_part )? -> ^( sample_key ( block_key )? ^( EXPR expression ) ( seed_part )? ) ;
    public final PLSQLParser_PLSQL_DMLParser.sample_clause_return sample_clause() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.sample_clause_return retval = new PLSQLParser_PLSQL_DMLParser.sample_clause_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token LEFT_PAREN493=null;
        Token RIGHT_PAREN495=null;
        PLSQLParser_PLSQLKeys.sample_key_return sample_key491 =null;

        PLSQLParser_PLSQLKeys.block_key_return block_key492 =null;

        PLSQLParser_PLSQL_DMLParser.expression_return expression494 =null;

        PLSQLParser_PLSQL_DMLParser.seed_part_return seed_part496 =null;


        Object LEFT_PAREN493_tree=null;
        Object RIGHT_PAREN495_tree=null;
        RewriteRuleTokenStream stream_LEFT_PAREN=new RewriteRuleTokenStream(adaptor,"token LEFT_PAREN");
        RewriteRuleTokenStream stream_RIGHT_PAREN=new RewriteRuleTokenStream(adaptor,"token RIGHT_PAREN");
        RewriteRuleSubtreeStream stream_expression=new RewriteRuleSubtreeStream(adaptor,"rule expression");
        RewriteRuleSubtreeStream stream_seed_part=new RewriteRuleSubtreeStream(adaptor,"rule seed_part");
        RewriteRuleSubtreeStream stream_sample_key=new RewriteRuleSubtreeStream(adaptor,"rule sample_key");
        RewriteRuleSubtreeStream stream_block_key=new RewriteRuleSubtreeStream(adaptor,"rule block_key");
        try {
            // PLSQL_DMLParser.g:747:5: ( sample_key ( block_key )? LEFT_PAREN expression RIGHT_PAREN ( seed_part )? -> ^( sample_key ( block_key )? ^( EXPR expression ) ( seed_part )? ) )
            // PLSQL_DMLParser.g:747:10: sample_key ( block_key )? LEFT_PAREN expression RIGHT_PAREN ( seed_part )?
            {
            pushFollow(FOLLOW_sample_key_in_sample_clause6587);
            sample_key491=gPLSQLParser.sample_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_sample_key.add(sample_key491.getTree());

            // PLSQL_DMLParser.g:747:21: ( block_key )?
            int alt161=2;
            int LA161_0 = input.LA(1);

            if ( (LA161_0==REGULAR_ID) && ((input.LT(1).getText().equalsIgnoreCase("block")))) {
                alt161=1;
            }
            switch (alt161) {
                case 1 :
                    // PLSQL_DMLParser.g:747:21: block_key
                    {
                    pushFollow(FOLLOW_block_key_in_sample_clause6589);
                    block_key492=gPLSQLParser.block_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_block_key.add(block_key492.getTree());

                    }
                    break;

            }


            LEFT_PAREN493=(Token)match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_sample_clause6601); if (state.failed) return retval; 
            if ( state.backtracking==0 ) stream_LEFT_PAREN.add(LEFT_PAREN493);


            pushFollow(FOLLOW_expression_in_sample_clause6603);
            expression494=expression();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_expression.add(expression494.getTree());

            RIGHT_PAREN495=(Token)match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_sample_clause6605); if (state.failed) return retval; 
            if ( state.backtracking==0 ) stream_RIGHT_PAREN.add(RIGHT_PAREN495);


            // PLSQL_DMLParser.g:749:9: ( seed_part )?
            int alt162=2;
            int LA162_0 = input.LA(1);

            if ( (LA162_0==REGULAR_ID) ) {
                int LA162_1 = input.LA(2);

                if ( ((input.LT(1).getText().equalsIgnoreCase("seed"))) ) {
                    alt162=1;
                }
            }
            switch (alt162) {
                case 1 :
                    // PLSQL_DMLParser.g:749:9: seed_part
                    {
                    pushFollow(FOLLOW_seed_part_in_sample_clause6615);
                    seed_part496=seed_part();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_seed_part.add(seed_part496.getTree());

                    }
                    break;

            }


            // AST REWRITE
            // elements: block_key, sample_key, seed_part, expression
            // token labels: 
            // rule labels: retval
            // token list labels: 
            // rule list labels: 
            // wildcard labels: 
            if ( state.backtracking==0 ) {

            retval.tree = root_0;
            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

            root_0 = (Object)adaptor.nil();
            // 750:9: -> ^( sample_key ( block_key )? ^( EXPR expression ) ( seed_part )? )
            {
                // PLSQL_DMLParser.g:750:12: ^( sample_key ( block_key )? ^( EXPR expression ) ( seed_part )? )
                {
                Object root_1 = (Object)adaptor.nil();
                root_1 = (Object)adaptor.becomeRoot(stream_sample_key.nextNode(), root_1);

                // PLSQL_DMLParser.g:750:25: ( block_key )?
                if ( stream_block_key.hasNext() ) {
                    adaptor.addChild(root_1, stream_block_key.nextTree());

                }
                stream_block_key.reset();

                // PLSQL_DMLParser.g:750:36: ^( EXPR expression )
                {
                Object root_2 = (Object)adaptor.nil();
                root_2 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(EXPR, "EXPR")
                , root_2);

                adaptor.addChild(root_2, stream_expression.nextTree());

                adaptor.addChild(root_1, root_2);
                }

                // PLSQL_DMLParser.g:750:55: ( seed_part )?
                if ( stream_seed_part.hasNext() ) {
                    adaptor.addChild(root_1, stream_seed_part.nextTree());

                }
                stream_seed_part.reset();

                adaptor.addChild(root_0, root_1);
                }

            }


            retval.tree = root_0;
            }

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "sample_clause"


    public static class seed_part_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "seed_part"
    // PLSQL_DMLParser.g:753:1: seed_part : seed_key LEFT_PAREN expression RIGHT_PAREN -> ^( seed_key ^( EXPR expression ) ) ;
    public final PLSQLParser_PLSQL_DMLParser.seed_part_return seed_part() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.seed_part_return retval = new PLSQLParser_PLSQL_DMLParser.seed_part_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token LEFT_PAREN498=null;
        Token RIGHT_PAREN500=null;
        PLSQLParser_PLSQLKeys.seed_key_return seed_key497 =null;

        PLSQLParser_PLSQL_DMLParser.expression_return expression499 =null;


        Object LEFT_PAREN498_tree=null;
        Object RIGHT_PAREN500_tree=null;
        RewriteRuleTokenStream stream_LEFT_PAREN=new RewriteRuleTokenStream(adaptor,"token LEFT_PAREN");
        RewriteRuleTokenStream stream_RIGHT_PAREN=new RewriteRuleTokenStream(adaptor,"token RIGHT_PAREN");
        RewriteRuleSubtreeStream stream_expression=new RewriteRuleSubtreeStream(adaptor,"rule expression");
        RewriteRuleSubtreeStream stream_seed_key=new RewriteRuleSubtreeStream(adaptor,"rule seed_key");
        try {
            // PLSQL_DMLParser.g:754:5: ( seed_key LEFT_PAREN expression RIGHT_PAREN -> ^( seed_key ^( EXPR expression ) ) )
            // PLSQL_DMLParser.g:754:10: seed_key LEFT_PAREN expression RIGHT_PAREN
            {
            pushFollow(FOLLOW_seed_key_in_seed_part6663);
            seed_key497=gPLSQLParser.seed_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_seed_key.add(seed_key497.getTree());

            LEFT_PAREN498=(Token)match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_seed_part6665); if (state.failed) return retval; 
            if ( state.backtracking==0 ) stream_LEFT_PAREN.add(LEFT_PAREN498);


            pushFollow(FOLLOW_expression_in_seed_part6667);
            expression499=expression();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_expression.add(expression499.getTree());

            RIGHT_PAREN500=(Token)match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_seed_part6669); if (state.failed) return retval; 
            if ( state.backtracking==0 ) stream_RIGHT_PAREN.add(RIGHT_PAREN500);


            // AST REWRITE
            // elements: expression, seed_key
            // token labels: 
            // rule labels: retval
            // token list labels: 
            // rule list labels: 
            // wildcard labels: 
            if ( state.backtracking==0 ) {

            retval.tree = root_0;
            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

            root_0 = (Object)adaptor.nil();
            // 755:9: -> ^( seed_key ^( EXPR expression ) )
            {
                // PLSQL_DMLParser.g:755:12: ^( seed_key ^( EXPR expression ) )
                {
                Object root_1 = (Object)adaptor.nil();
                root_1 = (Object)adaptor.becomeRoot(stream_seed_key.nextNode(), root_1);

                // PLSQL_DMLParser.g:755:23: ^( EXPR expression )
                {
                Object root_2 = (Object)adaptor.nil();
                root_2 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(EXPR, "EXPR")
                , root_2);

                adaptor.addChild(root_2, stream_expression.nextTree());

                adaptor.addChild(root_1, root_2);
                }

                adaptor.addChild(root_0, root_1);
                }

            }


            retval.tree = root_0;
            }

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "seed_part"


    public static class expression_list_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "expression_list"
    // PLSQL_DMLParser.g:762:1: expression_list : LEFT_PAREN ( expression )? ( COMMA expression )* RIGHT_PAREN -> ^( EXPR_LIST ( ^( EXPR expression ) )* ) ;
    public final PLSQLParser_PLSQL_DMLParser.expression_list_return expression_list() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.expression_list_return retval = new PLSQLParser_PLSQL_DMLParser.expression_list_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token LEFT_PAREN501=null;
        Token COMMA503=null;
        Token RIGHT_PAREN505=null;
        PLSQLParser_PLSQL_DMLParser.expression_return expression502 =null;

        PLSQLParser_PLSQL_DMLParser.expression_return expression504 =null;


        Object LEFT_PAREN501_tree=null;
        Object COMMA503_tree=null;
        Object RIGHT_PAREN505_tree=null;
        RewriteRuleTokenStream stream_LEFT_PAREN=new RewriteRuleTokenStream(adaptor,"token LEFT_PAREN");
        RewriteRuleTokenStream stream_RIGHT_PAREN=new RewriteRuleTokenStream(adaptor,"token RIGHT_PAREN");
        RewriteRuleTokenStream stream_COMMA=new RewriteRuleTokenStream(adaptor,"token COMMA");
        RewriteRuleSubtreeStream stream_expression=new RewriteRuleSubtreeStream(adaptor,"rule expression");
        try {
            // PLSQL_DMLParser.g:763:5: ( LEFT_PAREN ( expression )? ( COMMA expression )* RIGHT_PAREN -> ^( EXPR_LIST ( ^( EXPR expression ) )* ) )
            // PLSQL_DMLParser.g:763:10: LEFT_PAREN ( expression )? ( COMMA expression )* RIGHT_PAREN
            {
            LEFT_PAREN501=(Token)match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_expression_list6713); if (state.failed) return retval; 
            if ( state.backtracking==0 ) stream_LEFT_PAREN.add(LEFT_PAREN501);


            // PLSQL_DMLParser.g:763:21: ( expression )?
            int alt163=2;
            int LA163_0 = input.LA(1);

            if ( (LA163_0==APPROXIMATE_NUM_LIT||(LA163_0 >= CHAR_STRING && LA163_0 <= COLON)||LA163_0==DELIMITED_ID||LA163_0==EXACT_NUM_LIT||LA163_0==INTRODUCER||LA163_0==LEFT_PAREN||LA163_0==MINUS_SIGN||LA163_0==PLUS_SIGN||LA163_0==REGULAR_ID||LA163_0==SQL92_RESERVED_ALL||LA163_0==SQL92_RESERVED_ANY||LA163_0==SQL92_RESERVED_CASE||LA163_0==SQL92_RESERVED_DEFAULT||LA163_0==SQL92_RESERVED_DISTINCT||(LA163_0 >= SQL92_RESERVED_EXISTS && LA163_0 <= SQL92_RESERVED_FALSE)||(LA163_0 >= SQL92_RESERVED_NOT && LA163_0 <= SQL92_RESERVED_NULL)||LA163_0==SQL92_RESERVED_PRIOR||LA163_0==SQL92_RESERVED_TRUE||LA163_0==UNSIGNED_INTEGER) ) {
                alt163=1;
            }
            switch (alt163) {
                case 1 :
                    // PLSQL_DMLParser.g:763:21: expression
                    {
                    pushFollow(FOLLOW_expression_in_expression_list6715);
                    expression502=expression();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_expression.add(expression502.getTree());

                    }
                    break;

            }


            // PLSQL_DMLParser.g:763:33: ( COMMA expression )*
            loop164:
            do {
                int alt164=2;
                int LA164_0 = input.LA(1);

                if ( (LA164_0==COMMA) ) {
                    alt164=1;
                }


                switch (alt164) {
            	case 1 :
            	    // PLSQL_DMLParser.g:763:34: COMMA expression
            	    {
            	    COMMA503=(Token)match(input,COMMA,FOLLOW_COMMA_in_expression_list6719); if (state.failed) return retval; 
            	    if ( state.backtracking==0 ) stream_COMMA.add(COMMA503);


            	    pushFollow(FOLLOW_expression_in_expression_list6721);
            	    expression504=expression();

            	    state._fsp--;
            	    if (state.failed) return retval;
            	    if ( state.backtracking==0 ) stream_expression.add(expression504.getTree());

            	    }
            	    break;

            	default :
            	    break loop164;
                }
            } while (true);


            RIGHT_PAREN505=(Token)match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_expression_list6725); if (state.failed) return retval; 
            if ( state.backtracking==0 ) stream_RIGHT_PAREN.add(RIGHT_PAREN505);


            // AST REWRITE
            // elements: expression
            // token labels: 
            // rule labels: retval
            // token list labels: 
            // rule list labels: 
            // wildcard labels: 
            if ( state.backtracking==0 ) {

            retval.tree = root_0;
            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

            root_0 = (Object)adaptor.nil();
            // 764:9: -> ^( EXPR_LIST ( ^( EXPR expression ) )* )
            {
                // PLSQL_DMLParser.g:764:12: ^( EXPR_LIST ( ^( EXPR expression ) )* )
                {
                Object root_1 = (Object)adaptor.nil();
                root_1 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(EXPR_LIST, "EXPR_LIST")
                , root_1);

                // PLSQL_DMLParser.g:764:24: ( ^( EXPR expression ) )*
                while ( stream_expression.hasNext() ) {
                    // PLSQL_DMLParser.g:764:24: ^( EXPR expression )
                    {
                    Object root_2 = (Object)adaptor.nil();
                    root_2 = (Object)adaptor.becomeRoot(
                    (Object)adaptor.create(EXPR, "EXPR")
                    , root_2);

                    adaptor.addChild(root_2, stream_expression.nextTree());

                    adaptor.addChild(root_1, root_2);
                    }

                }
                stream_expression.reset();

                adaptor.addChild(root_0, root_1);
                }

            }


            retval.tree = root_0;
            }

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "expression_list"


    public static class condition_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "condition"
    // PLSQL_DMLParser.g:767:1: condition : expression ;
    public final PLSQLParser_PLSQL_DMLParser.condition_return condition() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.condition_return retval = new PLSQLParser_PLSQL_DMLParser.condition_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        PLSQLParser_PLSQL_DMLParser.expression_return expression506 =null;



        try {
            // PLSQL_DMLParser.g:768:5: ( expression )
            // PLSQL_DMLParser.g:768:11: expression
            {
            root_0 = (Object)adaptor.nil();


            pushFollow(FOLLOW_expression_in_condition6767);
            expression506=expression();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) adaptor.addChild(root_0, expression506.getTree());

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "condition"


    public static class condition_wrapper_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "condition_wrapper"
    // PLSQL_DMLParser.g:771:1: condition_wrapper : expression -> ^( LOGIC_EXPR expression ) ;
    public final PLSQLParser_PLSQL_DMLParser.condition_wrapper_return condition_wrapper() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.condition_wrapper_return retval = new PLSQLParser_PLSQL_DMLParser.condition_wrapper_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        PLSQLParser_PLSQL_DMLParser.expression_return expression507 =null;


        RewriteRuleSubtreeStream stream_expression=new RewriteRuleSubtreeStream(adaptor,"rule expression");
        try {
            // PLSQL_DMLParser.g:772:5: ( expression -> ^( LOGIC_EXPR expression ) )
            // PLSQL_DMLParser.g:772:10: expression
            {
            pushFollow(FOLLOW_expression_in_condition_wrapper6787);
            expression507=expression();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_expression.add(expression507.getTree());

            // AST REWRITE
            // elements: expression
            // token labels: 
            // rule labels: retval
            // token list labels: 
            // rule list labels: 
            // wildcard labels: 
            if ( state.backtracking==0 ) {

            retval.tree = root_0;
            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

            root_0 = (Object)adaptor.nil();
            // 773:9: -> ^( LOGIC_EXPR expression )
            {
                // PLSQL_DMLParser.g:773:12: ^( LOGIC_EXPR expression )
                {
                Object root_1 = (Object)adaptor.nil();
                root_1 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(LOGIC_EXPR, "LOGIC_EXPR")
                , root_1);

                adaptor.addChild(root_1, stream_expression.nextTree());

                adaptor.addChild(root_0, root_1);
                }

            }


            retval.tree = root_0;
            }

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "condition_wrapper"


    public static class expression_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "expression"
    // PLSQL_DMLParser.g:776:1: expression : logical_and_expression ( or_key ^ logical_and_expression )* ;
    public final PLSQLParser_PLSQL_DMLParser.expression_return expression() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.expression_return retval = new PLSQLParser_PLSQL_DMLParser.expression_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        PLSQLParser_PLSQL_DMLParser.logical_and_expression_return logical_and_expression508 =null;

        PLSQLParser_PLSQLKeys.or_key_return or_key509 =null;

        PLSQLParser_PLSQL_DMLParser.logical_and_expression_return logical_and_expression510 =null;



        try {
            // PLSQL_DMLParser.g:777:5: ( logical_and_expression ( or_key ^ logical_and_expression )* )
            // PLSQL_DMLParser.g:777:10: logical_and_expression ( or_key ^ logical_and_expression )*
            {
            root_0 = (Object)adaptor.nil();


            pushFollow(FOLLOW_logical_and_expression_in_expression6823);
            logical_and_expression508=logical_and_expression();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) adaptor.addChild(root_0, logical_and_expression508.getTree());

            // PLSQL_DMLParser.g:777:33: ( or_key ^ logical_and_expression )*
            loop165:
            do {
                int alt165=2;
                int LA165_0 = input.LA(1);

                if ( (LA165_0==SQL92_RESERVED_OR) ) {
                    alt165=1;
                }


                switch (alt165) {
            	case 1 :
            	    // PLSQL_DMLParser.g:777:35: or_key ^ logical_and_expression
            	    {
            	    pushFollow(FOLLOW_or_key_in_expression6827);
            	    or_key509=gPLSQLParser.or_key();

            	    state._fsp--;
            	    if (state.failed) return retval;
            	    if ( state.backtracking==0 ) root_0 = (Object)adaptor.becomeRoot(or_key509.getTree(), root_0);

            	    pushFollow(FOLLOW_logical_and_expression_in_expression6830);
            	    logical_and_expression510=logical_and_expression();

            	    state._fsp--;
            	    if (state.failed) return retval;
            	    if ( state.backtracking==0 ) adaptor.addChild(root_0, logical_and_expression510.getTree());

            	    }
            	    break;

            	default :
            	    break loop165;
                }
            } while (true);


            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "expression"


    public static class expression_wrapper_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "expression_wrapper"
    // PLSQL_DMLParser.g:780:1: expression_wrapper : expression -> ^( EXPR expression ) ;
    public final PLSQLParser_PLSQL_DMLParser.expression_wrapper_return expression_wrapper() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.expression_wrapper_return retval = new PLSQLParser_PLSQL_DMLParser.expression_wrapper_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        PLSQLParser_PLSQL_DMLParser.expression_return expression511 =null;


        RewriteRuleSubtreeStream stream_expression=new RewriteRuleSubtreeStream(adaptor,"rule expression");
        try {
            // PLSQL_DMLParser.g:781:5: ( expression -> ^( EXPR expression ) )
            // PLSQL_DMLParser.g:781:10: expression
            {
            pushFollow(FOLLOW_expression_in_expression_wrapper6857);
            expression511=expression();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_expression.add(expression511.getTree());

            // AST REWRITE
            // elements: expression
            // token labels: 
            // rule labels: retval
            // token list labels: 
            // rule list labels: 
            // wildcard labels: 
            if ( state.backtracking==0 ) {

            retval.tree = root_0;
            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

            root_0 = (Object)adaptor.nil();
            // 782:9: -> ^( EXPR expression )
            {
                // PLSQL_DMLParser.g:782:12: ^( EXPR expression )
                {
                Object root_1 = (Object)adaptor.nil();
                root_1 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(EXPR, "EXPR")
                , root_1);

                adaptor.addChild(root_1, stream_expression.nextTree());

                adaptor.addChild(root_0, root_1);
                }

            }


            retval.tree = root_0;
            }

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "expression_wrapper"


    public static class logical_and_expression_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "logical_and_expression"
    // PLSQL_DMLParser.g:785:1: logical_and_expression : negated_expression ( and_key ^ negated_expression )* ;
    public final PLSQLParser_PLSQL_DMLParser.logical_and_expression_return logical_and_expression() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.logical_and_expression_return retval = new PLSQLParser_PLSQL_DMLParser.logical_and_expression_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        PLSQLParser_PLSQL_DMLParser.negated_expression_return negated_expression512 =null;

        PLSQLParser_PLSQLKeys.and_key_return and_key513 =null;

        PLSQLParser_PLSQL_DMLParser.negated_expression_return negated_expression514 =null;



        try {
            // PLSQL_DMLParser.g:786:5: ( negated_expression ( and_key ^ negated_expression )* )
            // PLSQL_DMLParser.g:786:10: negated_expression ( and_key ^ negated_expression )*
            {
            root_0 = (Object)adaptor.nil();


            pushFollow(FOLLOW_negated_expression_in_logical_and_expression6893);
            negated_expression512=negated_expression();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) adaptor.addChild(root_0, negated_expression512.getTree());

            // PLSQL_DMLParser.g:786:29: ( and_key ^ negated_expression )*
            loop166:
            do {
                int alt166=2;
                int LA166_0 = input.LA(1);

                if ( (LA166_0==SQL92_RESERVED_AND) ) {
                    alt166=1;
                }


                switch (alt166) {
            	case 1 :
            	    // PLSQL_DMLParser.g:786:31: and_key ^ negated_expression
            	    {
            	    pushFollow(FOLLOW_and_key_in_logical_and_expression6897);
            	    and_key513=gPLSQLParser.and_key();

            	    state._fsp--;
            	    if (state.failed) return retval;
            	    if ( state.backtracking==0 ) root_0 = (Object)adaptor.becomeRoot(and_key513.getTree(), root_0);

            	    pushFollow(FOLLOW_negated_expression_in_logical_and_expression6900);
            	    negated_expression514=negated_expression();

            	    state._fsp--;
            	    if (state.failed) return retval;
            	    if ( state.backtracking==0 ) adaptor.addChild(root_0, negated_expression514.getTree());

            	    }
            	    break;

            	default :
            	    break loop166;
                }
            } while (true);


            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "logical_and_expression"


    public static class negated_expression_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "negated_expression"
    // PLSQL_DMLParser.g:789:1: negated_expression : ( not_key ^ negated_expression | equality_expression );
    public final PLSQLParser_PLSQL_DMLParser.negated_expression_return negated_expression() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.negated_expression_return retval = new PLSQLParser_PLSQL_DMLParser.negated_expression_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        PLSQLParser_PLSQLKeys.not_key_return not_key515 =null;

        PLSQLParser_PLSQL_DMLParser.negated_expression_return negated_expression516 =null;

        PLSQLParser_PLSQL_DMLParser.equality_expression_return equality_expression517 =null;



        try {
            // PLSQL_DMLParser.g:790:5: ( not_key ^ negated_expression | equality_expression )
            int alt167=2;
            int LA167_0 = input.LA(1);

            if ( (LA167_0==SQL92_RESERVED_NOT) ) {
                alt167=1;
            }
            else if ( (LA167_0==APPROXIMATE_NUM_LIT||(LA167_0 >= CHAR_STRING && LA167_0 <= COLON)||LA167_0==DELIMITED_ID||LA167_0==EXACT_NUM_LIT||LA167_0==INTRODUCER||LA167_0==LEFT_PAREN||LA167_0==MINUS_SIGN||LA167_0==PLUS_SIGN||LA167_0==REGULAR_ID||LA167_0==SQL92_RESERVED_ALL||LA167_0==SQL92_RESERVED_ANY||LA167_0==SQL92_RESERVED_CASE||LA167_0==SQL92_RESERVED_DEFAULT||LA167_0==SQL92_RESERVED_DISTINCT||(LA167_0 >= SQL92_RESERVED_EXISTS && LA167_0 <= SQL92_RESERVED_FALSE)||LA167_0==SQL92_RESERVED_NULL||LA167_0==SQL92_RESERVED_PRIOR||LA167_0==SQL92_RESERVED_TRUE||LA167_0==UNSIGNED_INTEGER) ) {
                alt167=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return retval;}
                NoViableAltException nvae =
                    new NoViableAltException("", 167, 0, input);

                throw nvae;

            }
            switch (alt167) {
                case 1 :
                    // PLSQL_DMLParser.g:790:10: not_key ^ negated_expression
                    {
                    root_0 = (Object)adaptor.nil();


                    pushFollow(FOLLOW_not_key_in_negated_expression6923);
                    not_key515=gPLSQLParser.not_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) root_0 = (Object)adaptor.becomeRoot(not_key515.getTree(), root_0);

                    pushFollow(FOLLOW_negated_expression_in_negated_expression6926);
                    negated_expression516=negated_expression();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, negated_expression516.getTree());

                    }
                    break;
                case 2 :
                    // PLSQL_DMLParser.g:791:10: equality_expression
                    {
                    root_0 = (Object)adaptor.nil();


                    pushFollow(FOLLOW_equality_expression_in_negated_expression6937);
                    equality_expression517=equality_expression();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, equality_expression517.getTree());

                    }
                    break;

            }
            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "negated_expression"


    public static class equality_expression_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "equality_expression"
    // PLSQL_DMLParser.g:794:1: equality_expression : ( multiset_expression -> multiset_expression ) ( is_key ( not_key )? ( null_key -> {isNegated}? ^( IS_NOT_NULL $equality_expression) -> ^( IS_NULL $equality_expression) | nan_key -> {isNegated}? ^( IS_NOT_NAN $equality_expression) -> ^( IS_NAN $equality_expression) | present_key -> {isNegated}? ^( IS_NOT_PRESENT $equality_expression) -> ^( IS_PRESENT $equality_expression) | infinite_key -> {isNegated}? ^( IS_NOT_INFINITE $equality_expression) -> ^( IS_INFINITE $equality_expression) | a_key set_key -> {isNegated}? ^( IS_NOT_A_SET $equality_expression) -> ^( IS_A_SET $equality_expression) | empty_key -> {isNegated}? ^( IS_NOT_EMPTY $equality_expression) -> ^( IS_EMPTY $equality_expression) | of_key ( type_key )? LEFT_PAREN type_spec ( COMMA type_spec )* RIGHT_PAREN -> {isNegated}? ^( IS_NOT_OF_TYPE $equality_expression ( type_spec )+ ) -> ^( IS_OF_TYPE $equality_expression ( type_spec )+ ) ) )* ;
    public final PLSQLParser_PLSQL_DMLParser.equality_expression_return equality_expression() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.equality_expression_return retval = new PLSQLParser_PLSQL_DMLParser.equality_expression_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token LEFT_PAREN530=null;
        Token COMMA532=null;
        Token RIGHT_PAREN534=null;
        PLSQLParser_PLSQL_DMLParser.multiset_expression_return multiset_expression518 =null;

        PLSQLParser_PLSQLKeys.is_key_return is_key519 =null;

        PLSQLParser_PLSQLKeys.not_key_return not_key520 =null;

        PLSQLParser_PLSQLKeys.null_key_return null_key521 =null;

        PLSQLParser_PLSQLKeys.nan_key_return nan_key522 =null;

        PLSQLParser_PLSQLKeys.present_key_return present_key523 =null;

        PLSQLParser_PLSQLKeys.infinite_key_return infinite_key524 =null;

        PLSQLParser_PLSQLKeys.a_key_return a_key525 =null;

        PLSQLParser_PLSQLKeys.set_key_return set_key526 =null;

        PLSQLParser_PLSQLKeys.empty_key_return empty_key527 =null;

        PLSQLParser_PLSQLKeys.of_key_return of_key528 =null;

        PLSQLParser_PLSQLKeys.type_key_return type_key529 =null;

        PLSQLParser_PLSQLCommons.type_spec_return type_spec531 =null;

        PLSQLParser_PLSQLCommons.type_spec_return type_spec533 =null;


        Object LEFT_PAREN530_tree=null;
        Object COMMA532_tree=null;
        Object RIGHT_PAREN534_tree=null;
        RewriteRuleTokenStream stream_LEFT_PAREN=new RewriteRuleTokenStream(adaptor,"token LEFT_PAREN");
        RewriteRuleTokenStream stream_RIGHT_PAREN=new RewriteRuleTokenStream(adaptor,"token RIGHT_PAREN");
        RewriteRuleTokenStream stream_COMMA=new RewriteRuleTokenStream(adaptor,"token COMMA");
        RewriteRuleSubtreeStream stream_type_spec=new RewriteRuleSubtreeStream(adaptor,"rule type_spec");
        RewriteRuleSubtreeStream stream_null_key=new RewriteRuleSubtreeStream(adaptor,"rule null_key");
        RewriteRuleSubtreeStream stream_a_key=new RewriteRuleSubtreeStream(adaptor,"rule a_key");
        RewriteRuleSubtreeStream stream_infinite_key=new RewriteRuleSubtreeStream(adaptor,"rule infinite_key");
        RewriteRuleSubtreeStream stream_multiset_expression=new RewriteRuleSubtreeStream(adaptor,"rule multiset_expression");
        RewriteRuleSubtreeStream stream_is_key=new RewriteRuleSubtreeStream(adaptor,"rule is_key");
        RewriteRuleSubtreeStream stream_present_key=new RewriteRuleSubtreeStream(adaptor,"rule present_key");
        RewriteRuleSubtreeStream stream_nan_key=new RewriteRuleSubtreeStream(adaptor,"rule nan_key");
        RewriteRuleSubtreeStream stream_empty_key=new RewriteRuleSubtreeStream(adaptor,"rule empty_key");
        RewriteRuleSubtreeStream stream_not_key=new RewriteRuleSubtreeStream(adaptor,"rule not_key");
        RewriteRuleSubtreeStream stream_set_key=new RewriteRuleSubtreeStream(adaptor,"rule set_key");
        RewriteRuleSubtreeStream stream_of_key=new RewriteRuleSubtreeStream(adaptor,"rule of_key");
        RewriteRuleSubtreeStream stream_type_key=new RewriteRuleSubtreeStream(adaptor,"rule type_key");
            boolean isNegated = false;    
        try {
            // PLSQL_DMLParser.g:796:5: ( ( multiset_expression -> multiset_expression ) ( is_key ( not_key )? ( null_key -> {isNegated}? ^( IS_NOT_NULL $equality_expression) -> ^( IS_NULL $equality_expression) | nan_key -> {isNegated}? ^( IS_NOT_NAN $equality_expression) -> ^( IS_NAN $equality_expression) | present_key -> {isNegated}? ^( IS_NOT_PRESENT $equality_expression) -> ^( IS_PRESENT $equality_expression) | infinite_key -> {isNegated}? ^( IS_NOT_INFINITE $equality_expression) -> ^( IS_INFINITE $equality_expression) | a_key set_key -> {isNegated}? ^( IS_NOT_A_SET $equality_expression) -> ^( IS_A_SET $equality_expression) | empty_key -> {isNegated}? ^( IS_NOT_EMPTY $equality_expression) -> ^( IS_EMPTY $equality_expression) | of_key ( type_key )? LEFT_PAREN type_spec ( COMMA type_spec )* RIGHT_PAREN -> {isNegated}? ^( IS_NOT_OF_TYPE $equality_expression ( type_spec )+ ) -> ^( IS_OF_TYPE $equality_expression ( type_spec )+ ) ) )* )
            // PLSQL_DMLParser.g:796:10: ( multiset_expression -> multiset_expression ) ( is_key ( not_key )? ( null_key -> {isNegated}? ^( IS_NOT_NULL $equality_expression) -> ^( IS_NULL $equality_expression) | nan_key -> {isNegated}? ^( IS_NOT_NAN $equality_expression) -> ^( IS_NAN $equality_expression) | present_key -> {isNegated}? ^( IS_NOT_PRESENT $equality_expression) -> ^( IS_PRESENT $equality_expression) | infinite_key -> {isNegated}? ^( IS_NOT_INFINITE $equality_expression) -> ^( IS_INFINITE $equality_expression) | a_key set_key -> {isNegated}? ^( IS_NOT_A_SET $equality_expression) -> ^( IS_A_SET $equality_expression) | empty_key -> {isNegated}? ^( IS_NOT_EMPTY $equality_expression) -> ^( IS_EMPTY $equality_expression) | of_key ( type_key )? LEFT_PAREN type_spec ( COMMA type_spec )* RIGHT_PAREN -> {isNegated}? ^( IS_NOT_OF_TYPE $equality_expression ( type_spec )+ ) -> ^( IS_OF_TYPE $equality_expression ( type_spec )+ ) ) )*
            {
            // PLSQL_DMLParser.g:796:10: ( multiset_expression -> multiset_expression )
            // PLSQL_DMLParser.g:796:11: multiset_expression
            {
            pushFollow(FOLLOW_multiset_expression_in_equality_expression6966);
            multiset_expression518=multiset_expression();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_multiset_expression.add(multiset_expression518.getTree());

            // AST REWRITE
            // elements: multiset_expression
            // token labels: 
            // rule labels: retval
            // token list labels: 
            // rule list labels: 
            // wildcard labels: 
            if ( state.backtracking==0 ) {

            retval.tree = root_0;
            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

            root_0 = (Object)adaptor.nil();
            // 796:31: -> multiset_expression
            {
                adaptor.addChild(root_0, stream_multiset_expression.nextTree());

            }


            retval.tree = root_0;
            }

            }


            // PLSQL_DMLParser.g:797:5: ( is_key ( not_key )? ( null_key -> {isNegated}? ^( IS_NOT_NULL $equality_expression) -> ^( IS_NULL $equality_expression) | nan_key -> {isNegated}? ^( IS_NOT_NAN $equality_expression) -> ^( IS_NAN $equality_expression) | present_key -> {isNegated}? ^( IS_NOT_PRESENT $equality_expression) -> ^( IS_PRESENT $equality_expression) | infinite_key -> {isNegated}? ^( IS_NOT_INFINITE $equality_expression) -> ^( IS_INFINITE $equality_expression) | a_key set_key -> {isNegated}? ^( IS_NOT_A_SET $equality_expression) -> ^( IS_A_SET $equality_expression) | empty_key -> {isNegated}? ^( IS_NOT_EMPTY $equality_expression) -> ^( IS_EMPTY $equality_expression) | of_key ( type_key )? LEFT_PAREN type_spec ( COMMA type_spec )* RIGHT_PAREN -> {isNegated}? ^( IS_NOT_OF_TYPE $equality_expression ( type_spec )+ ) -> ^( IS_OF_TYPE $equality_expression ( type_spec )+ ) ) )*
            loop172:
            do {
                int alt172=2;
                int LA172_0 = input.LA(1);

                if ( (LA172_0==SQL92_RESERVED_IS) ) {
                    alt172=1;
                }


                switch (alt172) {
            	case 1 :
            	    // PLSQL_DMLParser.g:797:10: is_key ( not_key )? ( null_key -> {isNegated}? ^( IS_NOT_NULL $equality_expression) -> ^( IS_NULL $equality_expression) | nan_key -> {isNegated}? ^( IS_NOT_NAN $equality_expression) -> ^( IS_NAN $equality_expression) | present_key -> {isNegated}? ^( IS_NOT_PRESENT $equality_expression) -> ^( IS_PRESENT $equality_expression) | infinite_key -> {isNegated}? ^( IS_NOT_INFINITE $equality_expression) -> ^( IS_INFINITE $equality_expression) | a_key set_key -> {isNegated}? ^( IS_NOT_A_SET $equality_expression) -> ^( IS_A_SET $equality_expression) | empty_key -> {isNegated}? ^( IS_NOT_EMPTY $equality_expression) -> ^( IS_EMPTY $equality_expression) | of_key ( type_key )? LEFT_PAREN type_spec ( COMMA type_spec )* RIGHT_PAREN -> {isNegated}? ^( IS_NOT_OF_TYPE $equality_expression ( type_spec )+ ) -> ^( IS_OF_TYPE $equality_expression ( type_spec )+ ) )
            	    {
            	    pushFollow(FOLLOW_is_key_in_equality_expression6982);
            	    is_key519=gPLSQLParser.is_key();

            	    state._fsp--;
            	    if (state.failed) return retval;
            	    if ( state.backtracking==0 ) stream_is_key.add(is_key519.getTree());

            	    // PLSQL_DMLParser.g:797:17: ( not_key )?
            	    int alt168=2;
            	    int LA168_0 = input.LA(1);

            	    if ( (LA168_0==SQL92_RESERVED_NOT) ) {
            	        alt168=1;
            	    }
            	    switch (alt168) {
            	        case 1 :
            	            // PLSQL_DMLParser.g:797:18: not_key
            	            {
            	            pushFollow(FOLLOW_not_key_in_equality_expression6985);
            	            not_key520=gPLSQLParser.not_key();

            	            state._fsp--;
            	            if (state.failed) return retval;
            	            if ( state.backtracking==0 ) stream_not_key.add(not_key520.getTree());

            	            if ( state.backtracking==0 ) {isNegated = true;}

            	            }
            	            break;

            	    }


            	    // PLSQL_DMLParser.g:798:9: ( null_key -> {isNegated}? ^( IS_NOT_NULL $equality_expression) -> ^( IS_NULL $equality_expression) | nan_key -> {isNegated}? ^( IS_NOT_NAN $equality_expression) -> ^( IS_NAN $equality_expression) | present_key -> {isNegated}? ^( IS_NOT_PRESENT $equality_expression) -> ^( IS_PRESENT $equality_expression) | infinite_key -> {isNegated}? ^( IS_NOT_INFINITE $equality_expression) -> ^( IS_INFINITE $equality_expression) | a_key set_key -> {isNegated}? ^( IS_NOT_A_SET $equality_expression) -> ^( IS_A_SET $equality_expression) | empty_key -> {isNegated}? ^( IS_NOT_EMPTY $equality_expression) -> ^( IS_EMPTY $equality_expression) | of_key ( type_key )? LEFT_PAREN type_spec ( COMMA type_spec )* RIGHT_PAREN -> {isNegated}? ^( IS_NOT_OF_TYPE $equality_expression ( type_spec )+ ) -> ^( IS_OF_TYPE $equality_expression ( type_spec )+ ) )
            	    int alt171=7;
            	    int LA171_0 = input.LA(1);

            	    if ( (LA171_0==SQL92_RESERVED_NULL) ) {
            	        alt171=1;
            	    }
            	    else if ( (LA171_0==REGULAR_ID) && (((input.LT(1).getText().equalsIgnoreCase("empty"))||(input.LT(1).getText().equalsIgnoreCase("present"))||(input.LT(1).getText().equalsIgnoreCase("infinite"))||(input.LT(1).getText().equalsIgnoreCase("nan"))||(input.LT(1).getText().equalsIgnoreCase("a"))))) {
            	        int LA171_2 = input.LA(2);

            	        if ( (LA171_2==REGULAR_ID) && ((input.LT(1).getText().equalsIgnoreCase("a")))) {
            	            alt171=5;
            	        }
            	        else if ( ((input.LT(1).getText().equalsIgnoreCase("nan"))) ) {
            	            alt171=2;
            	        }
            	        else if ( ((input.LT(1).getText().equalsIgnoreCase("present"))) ) {
            	            alt171=3;
            	        }
            	        else if ( ((input.LT(1).getText().equalsIgnoreCase("infinite"))) ) {
            	            alt171=4;
            	        }
            	        else if ( ((input.LT(1).getText().equalsIgnoreCase("empty"))) ) {
            	            alt171=6;
            	        }
            	        else {
            	            if (state.backtracking>0) {state.failed=true; return retval;}
            	            NoViableAltException nvae =
            	                new NoViableAltException("", 171, 2, input);

            	            throw nvae;

            	        }
            	    }
            	    else if ( (LA171_0==SQL92_RESERVED_OF) ) {
            	        alt171=7;
            	    }
            	    else {
            	        if (state.backtracking>0) {state.failed=true; return retval;}
            	        NoViableAltException nvae =
            	            new NoViableAltException("", 171, 0, input);

            	        throw nvae;

            	    }
            	    switch (alt171) {
            	        case 1 :
            	            // PLSQL_DMLParser.g:798:14: null_key
            	            {
            	            pushFollow(FOLLOW_null_key_in_equality_expression7004);
            	            null_key521=gPLSQLParser.null_key();

            	            state._fsp--;
            	            if (state.failed) return retval;
            	            if ( state.backtracking==0 ) stream_null_key.add(null_key521.getTree());

            	            // AST REWRITE
            	            // elements: equality_expression, equality_expression
            	            // token labels: 
            	            // rule labels: retval
            	            // token list labels: 
            	            // rule list labels: 
            	            // wildcard labels: 
            	            if ( state.backtracking==0 ) {

            	            retval.tree = root_0;
            	            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

            	            root_0 = (Object)adaptor.nil();
            	            // 799:17: -> {isNegated}? ^( IS_NOT_NULL $equality_expression)
            	            if (isNegated) {
            	                // PLSQL_DMLParser.g:799:33: ^( IS_NOT_NULL $equality_expression)
            	                {
            	                Object root_1 = (Object)adaptor.nil();
            	                root_1 = (Object)adaptor.becomeRoot(
            	                (Object)adaptor.create(IS_NOT_NULL, "IS_NOT_NULL")
            	                , root_1);

            	                adaptor.addChild(root_1, stream_retval.nextTree());

            	                adaptor.addChild(root_0, root_1);
            	                }

            	            }

            	            else // 800:17: -> ^( IS_NULL $equality_expression)
            	            {
            	                // PLSQL_DMLParser.g:800:20: ^( IS_NULL $equality_expression)
            	                {
            	                Object root_1 = (Object)adaptor.nil();
            	                root_1 = (Object)adaptor.becomeRoot(
            	                (Object)adaptor.create(IS_NULL, "IS_NULL")
            	                , root_1);

            	                adaptor.addChild(root_1, stream_retval.nextTree());

            	                adaptor.addChild(root_0, root_1);
            	                }

            	            }


            	            retval.tree = root_0;
            	            }

            	            }
            	            break;
            	        case 2 :
            	            // PLSQL_DMLParser.g:801:14: nan_key
            	            {
            	            pushFollow(FOLLOW_nan_key_in_equality_expression7071);
            	            nan_key522=gPLSQLParser.nan_key();

            	            state._fsp--;
            	            if (state.failed) return retval;
            	            if ( state.backtracking==0 ) stream_nan_key.add(nan_key522.getTree());

            	            // AST REWRITE
            	            // elements: equality_expression, equality_expression
            	            // token labels: 
            	            // rule labels: retval
            	            // token list labels: 
            	            // rule list labels: 
            	            // wildcard labels: 
            	            if ( state.backtracking==0 ) {

            	            retval.tree = root_0;
            	            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

            	            root_0 = (Object)adaptor.nil();
            	            // 802:17: -> {isNegated}? ^( IS_NOT_NAN $equality_expression)
            	            if (isNegated) {
            	                // PLSQL_DMLParser.g:802:33: ^( IS_NOT_NAN $equality_expression)
            	                {
            	                Object root_1 = (Object)adaptor.nil();
            	                root_1 = (Object)adaptor.becomeRoot(
            	                (Object)adaptor.create(IS_NOT_NAN, "IS_NOT_NAN")
            	                , root_1);

            	                adaptor.addChild(root_1, stream_retval.nextTree());

            	                adaptor.addChild(root_0, root_1);
            	                }

            	            }

            	            else // 803:17: -> ^( IS_NAN $equality_expression)
            	            {
            	                // PLSQL_DMLParser.g:803:20: ^( IS_NAN $equality_expression)
            	                {
            	                Object root_1 = (Object)adaptor.nil();
            	                root_1 = (Object)adaptor.becomeRoot(
            	                (Object)adaptor.create(IS_NAN, "IS_NAN")
            	                , root_1);

            	                adaptor.addChild(root_1, stream_retval.nextTree());

            	                adaptor.addChild(root_0, root_1);
            	                }

            	            }


            	            retval.tree = root_0;
            	            }

            	            }
            	            break;
            	        case 3 :
            	            // PLSQL_DMLParser.g:804:14: present_key
            	            {
            	            pushFollow(FOLLOW_present_key_in_equality_expression7138);
            	            present_key523=gPLSQLParser.present_key();

            	            state._fsp--;
            	            if (state.failed) return retval;
            	            if ( state.backtracking==0 ) stream_present_key.add(present_key523.getTree());

            	            // AST REWRITE
            	            // elements: equality_expression, equality_expression
            	            // token labels: 
            	            // rule labels: retval
            	            // token list labels: 
            	            // rule list labels: 
            	            // wildcard labels: 
            	            if ( state.backtracking==0 ) {

            	            retval.tree = root_0;
            	            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

            	            root_0 = (Object)adaptor.nil();
            	            // 805:17: -> {isNegated}? ^( IS_NOT_PRESENT $equality_expression)
            	            if (isNegated) {
            	                // PLSQL_DMLParser.g:805:33: ^( IS_NOT_PRESENT $equality_expression)
            	                {
            	                Object root_1 = (Object)adaptor.nil();
            	                root_1 = (Object)adaptor.becomeRoot(
            	                (Object)adaptor.create(IS_NOT_PRESENT, "IS_NOT_PRESENT")
            	                , root_1);

            	                adaptor.addChild(root_1, stream_retval.nextTree());

            	                adaptor.addChild(root_0, root_1);
            	                }

            	            }

            	            else // 806:17: -> ^( IS_PRESENT $equality_expression)
            	            {
            	                // PLSQL_DMLParser.g:806:20: ^( IS_PRESENT $equality_expression)
            	                {
            	                Object root_1 = (Object)adaptor.nil();
            	                root_1 = (Object)adaptor.becomeRoot(
            	                (Object)adaptor.create(IS_PRESENT, "IS_PRESENT")
            	                , root_1);

            	                adaptor.addChild(root_1, stream_retval.nextTree());

            	                adaptor.addChild(root_0, root_1);
            	                }

            	            }


            	            retval.tree = root_0;
            	            }

            	            }
            	            break;
            	        case 4 :
            	            // PLSQL_DMLParser.g:807:14: infinite_key
            	            {
            	            pushFollow(FOLLOW_infinite_key_in_equality_expression7205);
            	            infinite_key524=gPLSQLParser.infinite_key();

            	            state._fsp--;
            	            if (state.failed) return retval;
            	            if ( state.backtracking==0 ) stream_infinite_key.add(infinite_key524.getTree());

            	            // AST REWRITE
            	            // elements: equality_expression, equality_expression
            	            // token labels: 
            	            // rule labels: retval
            	            // token list labels: 
            	            // rule list labels: 
            	            // wildcard labels: 
            	            if ( state.backtracking==0 ) {

            	            retval.tree = root_0;
            	            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

            	            root_0 = (Object)adaptor.nil();
            	            // 808:17: -> {isNegated}? ^( IS_NOT_INFINITE $equality_expression)
            	            if (isNegated) {
            	                // PLSQL_DMLParser.g:808:33: ^( IS_NOT_INFINITE $equality_expression)
            	                {
            	                Object root_1 = (Object)adaptor.nil();
            	                root_1 = (Object)adaptor.becomeRoot(
            	                (Object)adaptor.create(IS_NOT_INFINITE, "IS_NOT_INFINITE")
            	                , root_1);

            	                adaptor.addChild(root_1, stream_retval.nextTree());

            	                adaptor.addChild(root_0, root_1);
            	                }

            	            }

            	            else // 809:17: -> ^( IS_INFINITE $equality_expression)
            	            {
            	                // PLSQL_DMLParser.g:809:20: ^( IS_INFINITE $equality_expression)
            	                {
            	                Object root_1 = (Object)adaptor.nil();
            	                root_1 = (Object)adaptor.becomeRoot(
            	                (Object)adaptor.create(IS_INFINITE, "IS_INFINITE")
            	                , root_1);

            	                adaptor.addChild(root_1, stream_retval.nextTree());

            	                adaptor.addChild(root_0, root_1);
            	                }

            	            }


            	            retval.tree = root_0;
            	            }

            	            }
            	            break;
            	        case 5 :
            	            // PLSQL_DMLParser.g:810:14: a_key set_key
            	            {
            	            pushFollow(FOLLOW_a_key_in_equality_expression7272);
            	            a_key525=gPLSQLParser.a_key();

            	            state._fsp--;
            	            if (state.failed) return retval;
            	            if ( state.backtracking==0 ) stream_a_key.add(a_key525.getTree());

            	            pushFollow(FOLLOW_set_key_in_equality_expression7274);
            	            set_key526=gPLSQLParser.set_key();

            	            state._fsp--;
            	            if (state.failed) return retval;
            	            if ( state.backtracking==0 ) stream_set_key.add(set_key526.getTree());

            	            // AST REWRITE
            	            // elements: equality_expression, equality_expression
            	            // token labels: 
            	            // rule labels: retval
            	            // token list labels: 
            	            // rule list labels: 
            	            // wildcard labels: 
            	            if ( state.backtracking==0 ) {

            	            retval.tree = root_0;
            	            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

            	            root_0 = (Object)adaptor.nil();
            	            // 811:17: -> {isNegated}? ^( IS_NOT_A_SET $equality_expression)
            	            if (isNegated) {
            	                // PLSQL_DMLParser.g:811:33: ^( IS_NOT_A_SET $equality_expression)
            	                {
            	                Object root_1 = (Object)adaptor.nil();
            	                root_1 = (Object)adaptor.becomeRoot(
            	                (Object)adaptor.create(IS_NOT_A_SET, "IS_NOT_A_SET")
            	                , root_1);

            	                adaptor.addChild(root_1, stream_retval.nextTree());

            	                adaptor.addChild(root_0, root_1);
            	                }

            	            }

            	            else // 812:17: -> ^( IS_A_SET $equality_expression)
            	            {
            	                // PLSQL_DMLParser.g:812:20: ^( IS_A_SET $equality_expression)
            	                {
            	                Object root_1 = (Object)adaptor.nil();
            	                root_1 = (Object)adaptor.becomeRoot(
            	                (Object)adaptor.create(IS_A_SET, "IS_A_SET")
            	                , root_1);

            	                adaptor.addChild(root_1, stream_retval.nextTree());

            	                adaptor.addChild(root_0, root_1);
            	                }

            	            }


            	            retval.tree = root_0;
            	            }

            	            }
            	            break;
            	        case 6 :
            	            // PLSQL_DMLParser.g:813:14: empty_key
            	            {
            	            pushFollow(FOLLOW_empty_key_in_equality_expression7341);
            	            empty_key527=gPLSQLParser.empty_key();

            	            state._fsp--;
            	            if (state.failed) return retval;
            	            if ( state.backtracking==0 ) stream_empty_key.add(empty_key527.getTree());

            	            // AST REWRITE
            	            // elements: equality_expression, equality_expression
            	            // token labels: 
            	            // rule labels: retval
            	            // token list labels: 
            	            // rule list labels: 
            	            // wildcard labels: 
            	            if ( state.backtracking==0 ) {

            	            retval.tree = root_0;
            	            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

            	            root_0 = (Object)adaptor.nil();
            	            // 814:17: -> {isNegated}? ^( IS_NOT_EMPTY $equality_expression)
            	            if (isNegated) {
            	                // PLSQL_DMLParser.g:814:33: ^( IS_NOT_EMPTY $equality_expression)
            	                {
            	                Object root_1 = (Object)adaptor.nil();
            	                root_1 = (Object)adaptor.becomeRoot(
            	                (Object)adaptor.create(IS_NOT_EMPTY, "IS_NOT_EMPTY")
            	                , root_1);

            	                adaptor.addChild(root_1, stream_retval.nextTree());

            	                adaptor.addChild(root_0, root_1);
            	                }

            	            }

            	            else // 815:17: -> ^( IS_EMPTY $equality_expression)
            	            {
            	                // PLSQL_DMLParser.g:815:20: ^( IS_EMPTY $equality_expression)
            	                {
            	                Object root_1 = (Object)adaptor.nil();
            	                root_1 = (Object)adaptor.becomeRoot(
            	                (Object)adaptor.create(IS_EMPTY, "IS_EMPTY")
            	                , root_1);

            	                adaptor.addChild(root_1, stream_retval.nextTree());

            	                adaptor.addChild(root_0, root_1);
            	                }

            	            }


            	            retval.tree = root_0;
            	            }

            	            }
            	            break;
            	        case 7 :
            	            // PLSQL_DMLParser.g:816:14: of_key ( type_key )? LEFT_PAREN type_spec ( COMMA type_spec )* RIGHT_PAREN
            	            {
            	            pushFollow(FOLLOW_of_key_in_equality_expression7408);
            	            of_key528=gPLSQLParser.of_key();

            	            state._fsp--;
            	            if (state.failed) return retval;
            	            if ( state.backtracking==0 ) stream_of_key.add(of_key528.getTree());

            	            // PLSQL_DMLParser.g:816:21: ( type_key )?
            	            int alt169=2;
            	            int LA169_0 = input.LA(1);

            	            if ( (LA169_0==REGULAR_ID) && ((input.LT(1).getText().equalsIgnoreCase("type")))) {
            	                alt169=1;
            	            }
            	            switch (alt169) {
            	                case 1 :
            	                    // PLSQL_DMLParser.g:816:21: type_key
            	                    {
            	                    pushFollow(FOLLOW_type_key_in_equality_expression7410);
            	                    type_key529=gPLSQLParser.type_key();

            	                    state._fsp--;
            	                    if (state.failed) return retval;
            	                    if ( state.backtracking==0 ) stream_type_key.add(type_key529.getTree());

            	                    }
            	                    break;

            	            }


            	            LEFT_PAREN530=(Token)match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_equality_expression7413); if (state.failed) return retval; 
            	            if ( state.backtracking==0 ) stream_LEFT_PAREN.add(LEFT_PAREN530);


            	            pushFollow(FOLLOW_type_spec_in_equality_expression7415);
            	            type_spec531=gPLSQLParser.type_spec();

            	            state._fsp--;
            	            if (state.failed) return retval;
            	            if ( state.backtracking==0 ) stream_type_spec.add(type_spec531.getTree());

            	            // PLSQL_DMLParser.g:816:52: ( COMMA type_spec )*
            	            loop170:
            	            do {
            	                int alt170=2;
            	                int LA170_0 = input.LA(1);

            	                if ( (LA170_0==COMMA) ) {
            	                    alt170=1;
            	                }


            	                switch (alt170) {
            	            	case 1 :
            	            	    // PLSQL_DMLParser.g:816:53: COMMA type_spec
            	            	    {
            	            	    COMMA532=(Token)match(input,COMMA,FOLLOW_COMMA_in_equality_expression7418); if (state.failed) return retval; 
            	            	    if ( state.backtracking==0 ) stream_COMMA.add(COMMA532);


            	            	    pushFollow(FOLLOW_type_spec_in_equality_expression7420);
            	            	    type_spec533=gPLSQLParser.type_spec();

            	            	    state._fsp--;
            	            	    if (state.failed) return retval;
            	            	    if ( state.backtracking==0 ) stream_type_spec.add(type_spec533.getTree());

            	            	    }
            	            	    break;

            	            	default :
            	            	    break loop170;
            	                }
            	            } while (true);


            	            RIGHT_PAREN534=(Token)match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_equality_expression7424); if (state.failed) return retval; 
            	            if ( state.backtracking==0 ) stream_RIGHT_PAREN.add(RIGHT_PAREN534);


            	            // AST REWRITE
            	            // elements: type_spec, type_spec, equality_expression, equality_expression
            	            // token labels: 
            	            // rule labels: retval
            	            // token list labels: 
            	            // rule list labels: 
            	            // wildcard labels: 
            	            if ( state.backtracking==0 ) {

            	            retval.tree = root_0;
            	            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

            	            root_0 = (Object)adaptor.nil();
            	            // 817:17: -> {isNegated}? ^( IS_NOT_OF_TYPE $equality_expression ( type_spec )+ )
            	            if (isNegated) {
            	                // PLSQL_DMLParser.g:817:33: ^( IS_NOT_OF_TYPE $equality_expression ( type_spec )+ )
            	                {
            	                Object root_1 = (Object)adaptor.nil();
            	                root_1 = (Object)adaptor.becomeRoot(
            	                (Object)adaptor.create(IS_NOT_OF_TYPE, "IS_NOT_OF_TYPE")
            	                , root_1);

            	                adaptor.addChild(root_1, stream_retval.nextTree());

            	                if ( !(stream_type_spec.hasNext()) ) {
            	                    throw new RewriteEarlyExitException();
            	                }
            	                while ( stream_type_spec.hasNext() ) {
            	                    adaptor.addChild(root_1, stream_type_spec.nextTree());

            	                }
            	                stream_type_spec.reset();

            	                adaptor.addChild(root_0, root_1);
            	                }

            	            }

            	            else // 818:17: -> ^( IS_OF_TYPE $equality_expression ( type_spec )+ )
            	            {
            	                // PLSQL_DMLParser.g:818:20: ^( IS_OF_TYPE $equality_expression ( type_spec )+ )
            	                {
            	                Object root_1 = (Object)adaptor.nil();
            	                root_1 = (Object)adaptor.becomeRoot(
            	                (Object)adaptor.create(IS_OF_TYPE, "IS_OF_TYPE")
            	                , root_1);

            	                adaptor.addChild(root_1, stream_retval.nextTree());

            	                if ( !(stream_type_spec.hasNext()) ) {
            	                    throw new RewriteEarlyExitException();
            	                }
            	                while ( stream_type_spec.hasNext() ) {
            	                    adaptor.addChild(root_1, stream_type_spec.nextTree());

            	                }
            	                stream_type_spec.reset();

            	                adaptor.addChild(root_0, root_1);
            	                }

            	            }


            	            retval.tree = root_0;
            	            }

            	            }
            	            break;

            	    }


            	    }
            	    break;

            	default :
            	    break loop172;
                }
            } while (true);


            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "equality_expression"


    public static class multiset_expression_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "multiset_expression"
    // PLSQL_DMLParser.g:824:1: multiset_expression : ( relational_expression -> relational_expression ) ( multiset_type ( of_key )? concatenation -> ^( multiset_type $multiset_expression ^( EXPR concatenation ) ) )? ;
    public final PLSQLParser_PLSQL_DMLParser.multiset_expression_return multiset_expression() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.multiset_expression_return retval = new PLSQLParser_PLSQL_DMLParser.multiset_expression_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        PLSQLParser_PLSQL_DMLParser.relational_expression_return relational_expression535 =null;

        PLSQLParser_PLSQL_DMLParser.multiset_type_return multiset_type536 =null;

        PLSQLParser_PLSQLKeys.of_key_return of_key537 =null;

        PLSQLParser_PLSQL_DMLParser.concatenation_return concatenation538 =null;


        RewriteRuleSubtreeStream stream_multiset_type=new RewriteRuleSubtreeStream(adaptor,"rule multiset_type");
        RewriteRuleSubtreeStream stream_relational_expression=new RewriteRuleSubtreeStream(adaptor,"rule relational_expression");
        RewriteRuleSubtreeStream stream_of_key=new RewriteRuleSubtreeStream(adaptor,"rule of_key");
        RewriteRuleSubtreeStream stream_concatenation=new RewriteRuleSubtreeStream(adaptor,"rule concatenation");
        try {
            // PLSQL_DMLParser.g:825:5: ( ( relational_expression -> relational_expression ) ( multiset_type ( of_key )? concatenation -> ^( multiset_type $multiset_expression ^( EXPR concatenation ) ) )? )
            // PLSQL_DMLParser.g:825:10: ( relational_expression -> relational_expression ) ( multiset_type ( of_key )? concatenation -> ^( multiset_type $multiset_expression ^( EXPR concatenation ) ) )?
            {
            // PLSQL_DMLParser.g:825:10: ( relational_expression -> relational_expression )
            // PLSQL_DMLParser.g:825:11: relational_expression
            {
            pushFollow(FOLLOW_relational_expression_in_multiset_expression7521);
            relational_expression535=relational_expression();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_relational_expression.add(relational_expression535.getTree());

            // AST REWRITE
            // elements: relational_expression
            // token labels: 
            // rule labels: retval
            // token list labels: 
            // rule list labels: 
            // wildcard labels: 
            if ( state.backtracking==0 ) {

            retval.tree = root_0;
            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

            root_0 = (Object)adaptor.nil();
            // 825:33: -> relational_expression
            {
                adaptor.addChild(root_0, stream_relational_expression.nextTree());

            }


            retval.tree = root_0;
            }

            }


            // PLSQL_DMLParser.g:826:5: ( multiset_type ( of_key )? concatenation -> ^( multiset_type $multiset_expression ^( EXPR concatenation ) ) )?
            int alt174=2;
            int LA174_0 = input.LA(1);

            if ( (LA174_0==REGULAR_ID) ) {
                int LA174_1 = input.LA(2);

                if ( (((input.LT(1).getText().equalsIgnoreCase("submultiset"))||(input.LT(1).getText().equalsIgnoreCase("member")))) ) {
                    alt174=1;
                }
            }
            switch (alt174) {
                case 1 :
                    // PLSQL_DMLParser.g:826:10: multiset_type ( of_key )? concatenation
                    {
                    pushFollow(FOLLOW_multiset_type_in_multiset_expression7537);
                    multiset_type536=multiset_type();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_multiset_type.add(multiset_type536.getTree());

                    // PLSQL_DMLParser.g:826:24: ( of_key )?
                    int alt173=2;
                    int LA173_0 = input.LA(1);

                    if ( (LA173_0==SQL92_RESERVED_OF) ) {
                        alt173=1;
                    }
                    switch (alt173) {
                        case 1 :
                            // PLSQL_DMLParser.g:826:24: of_key
                            {
                            pushFollow(FOLLOW_of_key_in_multiset_expression7539);
                            of_key537=gPLSQLParser.of_key();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) stream_of_key.add(of_key537.getTree());

                            }
                            break;

                    }


                    pushFollow(FOLLOW_concatenation_in_multiset_expression7542);
                    concatenation538=concatenation();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_concatenation.add(concatenation538.getTree());

                    // AST REWRITE
                    // elements: multiset_expression, concatenation, multiset_type
                    // token labels: 
                    // rule labels: retval
                    // token list labels: 
                    // rule list labels: 
                    // wildcard labels: 
                    if ( state.backtracking==0 ) {

                    retval.tree = root_0;
                    RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

                    root_0 = (Object)adaptor.nil();
                    // 827:9: -> ^( multiset_type $multiset_expression ^( EXPR concatenation ) )
                    {
                        // PLSQL_DMLParser.g:827:12: ^( multiset_type $multiset_expression ^( EXPR concatenation ) )
                        {
                        Object root_1 = (Object)adaptor.nil();
                        root_1 = (Object)adaptor.becomeRoot(stream_multiset_type.nextNode(), root_1);

                        adaptor.addChild(root_1, stream_retval.nextTree());

                        // PLSQL_DMLParser.g:827:49: ^( EXPR concatenation )
                        {
                        Object root_2 = (Object)adaptor.nil();
                        root_2 = (Object)adaptor.becomeRoot(
                        (Object)adaptor.create(EXPR, "EXPR")
                        , root_2);

                        adaptor.addChild(root_2, stream_concatenation.nextTree());

                        adaptor.addChild(root_1, root_2);
                        }

                        adaptor.addChild(root_0, root_1);
                        }

                    }


                    retval.tree = root_0;
                    }

                    }
                    break;

            }


            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "multiset_expression"


    public static class multiset_type_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "multiset_type"
    // PLSQL_DMLParser.g:830:1: multiset_type : ( member_key | submultiset_key );
    public final PLSQLParser_PLSQL_DMLParser.multiset_type_return multiset_type() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.multiset_type_return retval = new PLSQLParser_PLSQL_DMLParser.multiset_type_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        PLSQLParser_PLSQLKeys.member_key_return member_key539 =null;

        PLSQLParser_PLSQLKeys.submultiset_key_return submultiset_key540 =null;



        try {
            // PLSQL_DMLParser.g:831:5: ( member_key | submultiset_key )
            int alt175=2;
            int LA175_0 = input.LA(1);

            if ( (LA175_0==REGULAR_ID) && (((input.LT(1).getText().equalsIgnoreCase("submultiset"))||(input.LT(1).getText().equalsIgnoreCase("member"))))) {
                int LA175_1 = input.LA(2);

                if ( ((input.LT(1).getText().equalsIgnoreCase("member"))) ) {
                    alt175=1;
                }
                else if ( ((input.LT(1).getText().equalsIgnoreCase("submultiset"))) ) {
                    alt175=2;
                }
                else {
                    if (state.backtracking>0) {state.failed=true; return retval;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 175, 1, input);

                    throw nvae;

                }
            }
            else {
                if (state.backtracking>0) {state.failed=true; return retval;}
                NoViableAltException nvae =
                    new NoViableAltException("", 175, 0, input);

                throw nvae;

            }
            switch (alt175) {
                case 1 :
                    // PLSQL_DMLParser.g:831:10: member_key
                    {
                    root_0 = (Object)adaptor.nil();


                    pushFollow(FOLLOW_member_key_in_multiset_type7587);
                    member_key539=gPLSQLParser.member_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, member_key539.getTree());

                    }
                    break;
                case 2 :
                    // PLSQL_DMLParser.g:832:10: submultiset_key
                    {
                    root_0 = (Object)adaptor.nil();


                    pushFollow(FOLLOW_submultiset_key_in_multiset_type7598);
                    submultiset_key540=gPLSQLParser.submultiset_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, submultiset_key540.getTree());

                    }
                    break;

            }
            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "multiset_type"


    public static class relational_expression_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "relational_expression"
    // PLSQL_DMLParser.g:835:1: relational_expression : compound_expression ( ( EQUALS_OP ^| NOT_EQUAL_OP ^| LESS_THAN_OP ^| GREATER_THAN_OP ^| LESS_THAN_OR_EQUALS_OP ^| GREATER_THAN_OR_EQUALS_OP ^) compound_expression )* ;
    public final PLSQLParser_PLSQL_DMLParser.relational_expression_return relational_expression() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.relational_expression_return retval = new PLSQLParser_PLSQL_DMLParser.relational_expression_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token EQUALS_OP542=null;
        Token NOT_EQUAL_OP543=null;
        Token LESS_THAN_OP544=null;
        Token GREATER_THAN_OP545=null;
        Token LESS_THAN_OR_EQUALS_OP546=null;
        Token GREATER_THAN_OR_EQUALS_OP547=null;
        PLSQLParser_PLSQL_DMLParser.compound_expression_return compound_expression541 =null;

        PLSQLParser_PLSQL_DMLParser.compound_expression_return compound_expression548 =null;


        Object EQUALS_OP542_tree=null;
        Object NOT_EQUAL_OP543_tree=null;
        Object LESS_THAN_OP544_tree=null;
        Object GREATER_THAN_OP545_tree=null;
        Object LESS_THAN_OR_EQUALS_OP546_tree=null;
        Object GREATER_THAN_OR_EQUALS_OP547_tree=null;

        try {
            // PLSQL_DMLParser.g:836:5: ( compound_expression ( ( EQUALS_OP ^| NOT_EQUAL_OP ^| LESS_THAN_OP ^| GREATER_THAN_OP ^| LESS_THAN_OR_EQUALS_OP ^| GREATER_THAN_OR_EQUALS_OP ^) compound_expression )* )
            // PLSQL_DMLParser.g:836:10: compound_expression ( ( EQUALS_OP ^| NOT_EQUAL_OP ^| LESS_THAN_OP ^| GREATER_THAN_OP ^| LESS_THAN_OR_EQUALS_OP ^| GREATER_THAN_OR_EQUALS_OP ^) compound_expression )*
            {
            root_0 = (Object)adaptor.nil();


            pushFollow(FOLLOW_compound_expression_in_relational_expression7618);
            compound_expression541=compound_expression();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) adaptor.addChild(root_0, compound_expression541.getTree());

            // PLSQL_DMLParser.g:837:5: ( ( EQUALS_OP ^| NOT_EQUAL_OP ^| LESS_THAN_OP ^| GREATER_THAN_OP ^| LESS_THAN_OR_EQUALS_OP ^| GREATER_THAN_OR_EQUALS_OP ^) compound_expression )*
            loop177:
            do {
                int alt177=2;
                switch ( input.LA(1) ) {
                case EQUALS_OP:
                    {
                    alt177=1;
                    }
                    break;
                case NOT_EQUAL_OP:
                    {
                    alt177=1;
                    }
                    break;
                case LESS_THAN_OP:
                    {
                    alt177=1;
                    }
                    break;
                case GREATER_THAN_OP:
                    {
                    alt177=1;
                    }
                    break;
                case LESS_THAN_OR_EQUALS_OP:
                    {
                    alt177=1;
                    }
                    break;
                case GREATER_THAN_OR_EQUALS_OP:
                    {
                    alt177=1;
                    }
                    break;

                }

                switch (alt177) {
            	case 1 :
            	    // PLSQL_DMLParser.g:837:7: ( EQUALS_OP ^| NOT_EQUAL_OP ^| LESS_THAN_OP ^| GREATER_THAN_OP ^| LESS_THAN_OR_EQUALS_OP ^| GREATER_THAN_OR_EQUALS_OP ^) compound_expression
            	    {
            	    // PLSQL_DMLParser.g:837:7: ( EQUALS_OP ^| NOT_EQUAL_OP ^| LESS_THAN_OP ^| GREATER_THAN_OP ^| LESS_THAN_OR_EQUALS_OP ^| GREATER_THAN_OR_EQUALS_OP ^)
            	    int alt176=6;
            	    switch ( input.LA(1) ) {
            	    case EQUALS_OP:
            	        {
            	        alt176=1;
            	        }
            	        break;
            	    case NOT_EQUAL_OP:
            	        {
            	        alt176=2;
            	        }
            	        break;
            	    case LESS_THAN_OP:
            	        {
            	        alt176=3;
            	        }
            	        break;
            	    case GREATER_THAN_OP:
            	        {
            	        alt176=4;
            	        }
            	        break;
            	    case LESS_THAN_OR_EQUALS_OP:
            	        {
            	        alt176=5;
            	        }
            	        break;
            	    case GREATER_THAN_OR_EQUALS_OP:
            	        {
            	        alt176=6;
            	        }
            	        break;
            	    default:
            	        if (state.backtracking>0) {state.failed=true; return retval;}
            	        NoViableAltException nvae =
            	            new NoViableAltException("", 176, 0, input);

            	        throw nvae;

            	    }

            	    switch (alt176) {
            	        case 1 :
            	            // PLSQL_DMLParser.g:837:9: EQUALS_OP ^
            	            {
            	            EQUALS_OP542=(Token)match(input,EQUALS_OP,FOLLOW_EQUALS_OP_in_relational_expression7628); if (state.failed) return retval;
            	            if ( state.backtracking==0 ) {
            	            EQUALS_OP542_tree = 
            	            (Object)adaptor.create(EQUALS_OP542)
            	            ;
            	            root_0 = (Object)adaptor.becomeRoot(EQUALS_OP542_tree, root_0);
            	            }

            	            }
            	            break;
            	        case 2 :
            	            // PLSQL_DMLParser.g:837:22: NOT_EQUAL_OP ^
            	            {
            	            NOT_EQUAL_OP543=(Token)match(input,NOT_EQUAL_OP,FOLLOW_NOT_EQUAL_OP_in_relational_expression7633); if (state.failed) return retval;
            	            if ( state.backtracking==0 ) {
            	            NOT_EQUAL_OP543_tree = 
            	            (Object)adaptor.create(NOT_EQUAL_OP543)
            	            ;
            	            root_0 = (Object)adaptor.becomeRoot(NOT_EQUAL_OP543_tree, root_0);
            	            }

            	            }
            	            break;
            	        case 3 :
            	            // PLSQL_DMLParser.g:837:38: LESS_THAN_OP ^
            	            {
            	            LESS_THAN_OP544=(Token)match(input,LESS_THAN_OP,FOLLOW_LESS_THAN_OP_in_relational_expression7638); if (state.failed) return retval;
            	            if ( state.backtracking==0 ) {
            	            LESS_THAN_OP544_tree = 
            	            (Object)adaptor.create(LESS_THAN_OP544)
            	            ;
            	            root_0 = (Object)adaptor.becomeRoot(LESS_THAN_OP544_tree, root_0);
            	            }

            	            }
            	            break;
            	        case 4 :
            	            // PLSQL_DMLParser.g:837:54: GREATER_THAN_OP ^
            	            {
            	            GREATER_THAN_OP545=(Token)match(input,GREATER_THAN_OP,FOLLOW_GREATER_THAN_OP_in_relational_expression7643); if (state.failed) return retval;
            	            if ( state.backtracking==0 ) {
            	            GREATER_THAN_OP545_tree = 
            	            (Object)adaptor.create(GREATER_THAN_OP545)
            	            ;
            	            root_0 = (Object)adaptor.becomeRoot(GREATER_THAN_OP545_tree, root_0);
            	            }

            	            }
            	            break;
            	        case 5 :
            	            // PLSQL_DMLParser.g:837:73: LESS_THAN_OR_EQUALS_OP ^
            	            {
            	            LESS_THAN_OR_EQUALS_OP546=(Token)match(input,LESS_THAN_OR_EQUALS_OP,FOLLOW_LESS_THAN_OR_EQUALS_OP_in_relational_expression7648); if (state.failed) return retval;
            	            if ( state.backtracking==0 ) {
            	            LESS_THAN_OR_EQUALS_OP546_tree = 
            	            (Object)adaptor.create(LESS_THAN_OR_EQUALS_OP546)
            	            ;
            	            root_0 = (Object)adaptor.becomeRoot(LESS_THAN_OR_EQUALS_OP546_tree, root_0);
            	            }

            	            }
            	            break;
            	        case 6 :
            	            // PLSQL_DMLParser.g:837:99: GREATER_THAN_OR_EQUALS_OP ^
            	            {
            	            GREATER_THAN_OR_EQUALS_OP547=(Token)match(input,GREATER_THAN_OR_EQUALS_OP,FOLLOW_GREATER_THAN_OR_EQUALS_OP_in_relational_expression7653); if (state.failed) return retval;
            	            if ( state.backtracking==0 ) {
            	            GREATER_THAN_OR_EQUALS_OP547_tree = 
            	            (Object)adaptor.create(GREATER_THAN_OR_EQUALS_OP547)
            	            ;
            	            root_0 = (Object)adaptor.becomeRoot(GREATER_THAN_OR_EQUALS_OP547_tree, root_0);
            	            }

            	            }
            	            break;

            	    }


            	    pushFollow(FOLLOW_compound_expression_in_relational_expression7658);
            	    compound_expression548=compound_expression();

            	    state._fsp--;
            	    if (state.failed) return retval;
            	    if ( state.backtracking==0 ) adaptor.addChild(root_0, compound_expression548.getTree());

            	    }
            	    break;

            	default :
            	    break loop177;
                }
            } while (true);


            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "relational_expression"


    public static class compound_expression_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "compound_expression"
    // PLSQL_DMLParser.g:840:1: compound_expression : ( concatenation -> concatenation ) ( ( not_key )? ( in_key in_elements -> {isNegated}? ^( NOT_IN $compound_expression in_elements ) -> ^( in_key $compound_expression in_elements ) | between_key between_elements -> {isNegated}? ^( NOT_BETWEEN $compound_expression between_elements ) -> ^( between_key $compound_expression between_elements ) | like_type concatenation ( like_escape_part )? -> {isNegated}? ^( NOT_LIKE $compound_expression ^( EXPR concatenation ) ( like_escape_part )? ) -> ^( like_type $compound_expression ^( EXPR concatenation ) ( like_escape_part )? ) ) )? ;
    public final PLSQLParser_PLSQL_DMLParser.compound_expression_return compound_expression() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.compound_expression_return retval = new PLSQLParser_PLSQL_DMLParser.compound_expression_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        PLSQLParser_PLSQL_DMLParser.concatenation_return concatenation549 =null;

        PLSQLParser_PLSQLKeys.not_key_return not_key550 =null;

        PLSQLParser_PLSQLKeys.in_key_return in_key551 =null;

        PLSQLParser_PLSQL_DMLParser.in_elements_return in_elements552 =null;

        PLSQLParser_PLSQLKeys.between_key_return between_key553 =null;

        PLSQLParser_PLSQL_DMLParser.between_elements_return between_elements554 =null;

        PLSQLParser_PLSQL_DMLParser.like_type_return like_type555 =null;

        PLSQLParser_PLSQL_DMLParser.concatenation_return concatenation556 =null;

        PLSQLParser_PLSQL_DMLParser.like_escape_part_return like_escape_part557 =null;


        RewriteRuleSubtreeStream stream_between_elements=new RewriteRuleSubtreeStream(adaptor,"rule between_elements");
        RewriteRuleSubtreeStream stream_like_escape_part=new RewriteRuleSubtreeStream(adaptor,"rule like_escape_part");
        RewriteRuleSubtreeStream stream_between_key=new RewriteRuleSubtreeStream(adaptor,"rule between_key");
        RewriteRuleSubtreeStream stream_not_key=new RewriteRuleSubtreeStream(adaptor,"rule not_key");
        RewriteRuleSubtreeStream stream_like_type=new RewriteRuleSubtreeStream(adaptor,"rule like_type");
        RewriteRuleSubtreeStream stream_concatenation=new RewriteRuleSubtreeStream(adaptor,"rule concatenation");
        RewriteRuleSubtreeStream stream_in_key=new RewriteRuleSubtreeStream(adaptor,"rule in_key");
        RewriteRuleSubtreeStream stream_in_elements=new RewriteRuleSubtreeStream(adaptor,"rule in_elements");
            boolean isNegated = false;    
        try {
            // PLSQL_DMLParser.g:842:5: ( ( concatenation -> concatenation ) ( ( not_key )? ( in_key in_elements -> {isNegated}? ^( NOT_IN $compound_expression in_elements ) -> ^( in_key $compound_expression in_elements ) | between_key between_elements -> {isNegated}? ^( NOT_BETWEEN $compound_expression between_elements ) -> ^( between_key $compound_expression between_elements ) | like_type concatenation ( like_escape_part )? -> {isNegated}? ^( NOT_LIKE $compound_expression ^( EXPR concatenation ) ( like_escape_part )? ) -> ^( like_type $compound_expression ^( EXPR concatenation ) ( like_escape_part )? ) ) )? )
            // PLSQL_DMLParser.g:842:10: ( concatenation -> concatenation ) ( ( not_key )? ( in_key in_elements -> {isNegated}? ^( NOT_IN $compound_expression in_elements ) -> ^( in_key $compound_expression in_elements ) | between_key between_elements -> {isNegated}? ^( NOT_BETWEEN $compound_expression between_elements ) -> ^( between_key $compound_expression between_elements ) | like_type concatenation ( like_escape_part )? -> {isNegated}? ^( NOT_LIKE $compound_expression ^( EXPR concatenation ) ( like_escape_part )? ) -> ^( like_type $compound_expression ^( EXPR concatenation ) ( like_escape_part )? ) ) )?
            {
            // PLSQL_DMLParser.g:842:10: ( concatenation -> concatenation )
            // PLSQL_DMLParser.g:842:11: concatenation
            {
            pushFollow(FOLLOW_concatenation_in_compound_expression7689);
            concatenation549=concatenation();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_concatenation.add(concatenation549.getTree());

            // AST REWRITE
            // elements: concatenation
            // token labels: 
            // rule labels: retval
            // token list labels: 
            // rule list labels: 
            // wildcard labels: 
            if ( state.backtracking==0 ) {

            retval.tree = root_0;
            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

            root_0 = (Object)adaptor.nil();
            // 842:25: -> concatenation
            {
                adaptor.addChild(root_0, stream_concatenation.nextTree());

            }


            retval.tree = root_0;
            }

            }


            // PLSQL_DMLParser.g:843:5: ( ( not_key )? ( in_key in_elements -> {isNegated}? ^( NOT_IN $compound_expression in_elements ) -> ^( in_key $compound_expression in_elements ) | between_key between_elements -> {isNegated}? ^( NOT_BETWEEN $compound_expression between_elements ) -> ^( between_key $compound_expression between_elements ) | like_type concatenation ( like_escape_part )? -> {isNegated}? ^( NOT_LIKE $compound_expression ^( EXPR concatenation ) ( like_escape_part )? ) -> ^( like_type $compound_expression ^( EXPR concatenation ) ( like_escape_part )? ) ) )?
            int alt181=2;
            switch ( input.LA(1) ) {
                case SQL92_RESERVED_NOT:
                    {
                    alt181=1;
                    }
                    break;
                case SQL92_RESERVED_IN:
                    {
                    alt181=1;
                    }
                    break;
                case SQL92_RESERVED_BETWEEN:
                    {
                    alt181=1;
                    }
                    break;
                case SQL92_RESERVED_LIKE:
                    {
                    alt181=1;
                    }
                    break;
                case REGULAR_ID:
                    {
                    int LA181_5 = input.LA(2);

                    if ( (((input.LT(1).getText().equalsIgnoreCase("like4"))||(input.LT(1).getText().equalsIgnoreCase("like2"))||(input.LT(1).getText().equalsIgnoreCase("likec")))) ) {
                        alt181=1;
                    }
                    }
                    break;
            }

            switch (alt181) {
                case 1 :
                    // PLSQL_DMLParser.g:843:10: ( not_key )? ( in_key in_elements -> {isNegated}? ^( NOT_IN $compound_expression in_elements ) -> ^( in_key $compound_expression in_elements ) | between_key between_elements -> {isNegated}? ^( NOT_BETWEEN $compound_expression between_elements ) -> ^( between_key $compound_expression between_elements ) | like_type concatenation ( like_escape_part )? -> {isNegated}? ^( NOT_LIKE $compound_expression ^( EXPR concatenation ) ( like_escape_part )? ) -> ^( like_type $compound_expression ^( EXPR concatenation ) ( like_escape_part )? ) )
                    {
                    // PLSQL_DMLParser.g:843:10: ( not_key )?
                    int alt178=2;
                    int LA178_0 = input.LA(1);

                    if ( (LA178_0==SQL92_RESERVED_NOT) ) {
                        alt178=1;
                    }
                    switch (alt178) {
                        case 1 :
                            // PLSQL_DMLParser.g:843:11: not_key
                            {
                            pushFollow(FOLLOW_not_key_in_compound_expression7706);
                            not_key550=gPLSQLParser.not_key();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) stream_not_key.add(not_key550.getTree());

                            if ( state.backtracking==0 ) {isNegated = true;}

                            }
                            break;

                    }


                    // PLSQL_DMLParser.g:844:9: ( in_key in_elements -> {isNegated}? ^( NOT_IN $compound_expression in_elements ) -> ^( in_key $compound_expression in_elements ) | between_key between_elements -> {isNegated}? ^( NOT_BETWEEN $compound_expression between_elements ) -> ^( between_key $compound_expression between_elements ) | like_type concatenation ( like_escape_part )? -> {isNegated}? ^( NOT_LIKE $compound_expression ^( EXPR concatenation ) ( like_escape_part )? ) -> ^( like_type $compound_expression ^( EXPR concatenation ) ( like_escape_part )? ) )
                    int alt180=3;
                    int LA180_0 = input.LA(1);

                    if ( (LA180_0==SQL92_RESERVED_IN) ) {
                        alt180=1;
                    }
                    else if ( (LA180_0==SQL92_RESERVED_BETWEEN) ) {
                        alt180=2;
                    }
                    else if ( (LA180_0==SQL92_RESERVED_LIKE) ) {
                        alt180=3;
                    }
                    else if ( (LA180_0==REGULAR_ID) && (((input.LT(1).getText().equalsIgnoreCase("like4"))||(input.LT(1).getText().equalsIgnoreCase("like2"))||(input.LT(1).getText().equalsIgnoreCase("likec"))))) {
                        alt180=3;
                    }
                    else {
                        if (state.backtracking>0) {state.failed=true; return retval;}
                        NoViableAltException nvae =
                            new NoViableAltException("", 180, 0, input);

                        throw nvae;

                    }
                    switch (alt180) {
                        case 1 :
                            // PLSQL_DMLParser.g:844:14: in_key in_elements
                            {
                            pushFollow(FOLLOW_in_key_in_compound_expression7726);
                            in_key551=gPLSQLParser.in_key();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) stream_in_key.add(in_key551.getTree());

                            pushFollow(FOLLOW_in_elements_in_compound_expression7728);
                            in_elements552=in_elements();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) stream_in_elements.add(in_elements552.getTree());

                            // AST REWRITE
                            // elements: compound_expression, in_elements, in_elements, in_key, compound_expression
                            // token labels: 
                            // rule labels: retval
                            // token list labels: 
                            // rule list labels: 
                            // wildcard labels: 
                            if ( state.backtracking==0 ) {

                            retval.tree = root_0;
                            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

                            root_0 = (Object)adaptor.nil();
                            // 845:17: -> {isNegated}? ^( NOT_IN $compound_expression in_elements )
                            if (isNegated) {
                                // PLSQL_DMLParser.g:845:33: ^( NOT_IN $compound_expression in_elements )
                                {
                                Object root_1 = (Object)adaptor.nil();
                                root_1 = (Object)adaptor.becomeRoot(
                                (Object)adaptor.create(NOT_IN, "NOT_IN")
                                , root_1);

                                adaptor.addChild(root_1, stream_retval.nextTree());

                                adaptor.addChild(root_1, stream_in_elements.nextTree());

                                adaptor.addChild(root_0, root_1);
                                }

                            }

                            else // 846:17: -> ^( in_key $compound_expression in_elements )
                            {
                                // PLSQL_DMLParser.g:846:20: ^( in_key $compound_expression in_elements )
                                {
                                Object root_1 = (Object)adaptor.nil();
                                root_1 = (Object)adaptor.becomeRoot(stream_in_key.nextNode(), root_1);

                                adaptor.addChild(root_1, stream_retval.nextTree());

                                adaptor.addChild(root_1, stream_in_elements.nextTree());

                                adaptor.addChild(root_0, root_1);
                                }

                            }


                            retval.tree = root_0;
                            }

                            }
                            break;
                        case 2 :
                            // PLSQL_DMLParser.g:847:14: between_key between_elements
                            {
                            pushFollow(FOLLOW_between_key_in_compound_expression7799);
                            between_key553=gPLSQLParser.between_key();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) stream_between_key.add(between_key553.getTree());

                            pushFollow(FOLLOW_between_elements_in_compound_expression7801);
                            between_elements554=between_elements();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) stream_between_elements.add(between_elements554.getTree());

                            // AST REWRITE
                            // elements: compound_expression, between_elements, between_key, between_elements, compound_expression
                            // token labels: 
                            // rule labels: retval
                            // token list labels: 
                            // rule list labels: 
                            // wildcard labels: 
                            if ( state.backtracking==0 ) {

                            retval.tree = root_0;
                            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

                            root_0 = (Object)adaptor.nil();
                            // 848:17: -> {isNegated}? ^( NOT_BETWEEN $compound_expression between_elements )
                            if (isNegated) {
                                // PLSQL_DMLParser.g:848:33: ^( NOT_BETWEEN $compound_expression between_elements )
                                {
                                Object root_1 = (Object)adaptor.nil();
                                root_1 = (Object)adaptor.becomeRoot(
                                (Object)adaptor.create(NOT_BETWEEN, "NOT_BETWEEN")
                                , root_1);

                                adaptor.addChild(root_1, stream_retval.nextTree());

                                adaptor.addChild(root_1, stream_between_elements.nextTree());

                                adaptor.addChild(root_0, root_1);
                                }

                            }

                            else // 849:17: -> ^( between_key $compound_expression between_elements )
                            {
                                // PLSQL_DMLParser.g:849:20: ^( between_key $compound_expression between_elements )
                                {
                                Object root_1 = (Object)adaptor.nil();
                                root_1 = (Object)adaptor.becomeRoot(stream_between_key.nextNode(), root_1);

                                adaptor.addChild(root_1, stream_retval.nextTree());

                                adaptor.addChild(root_1, stream_between_elements.nextTree());

                                adaptor.addChild(root_0, root_1);
                                }

                            }


                            retval.tree = root_0;
                            }

                            }
                            break;
                        case 3 :
                            // PLSQL_DMLParser.g:850:14: like_type concatenation ( like_escape_part )?
                            {
                            pushFollow(FOLLOW_like_type_in_compound_expression7872);
                            like_type555=like_type();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) stream_like_type.add(like_type555.getTree());

                            pushFollow(FOLLOW_concatenation_in_compound_expression7874);
                            concatenation556=concatenation();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) stream_concatenation.add(concatenation556.getTree());

                            // PLSQL_DMLParser.g:850:38: ( like_escape_part )?
                            int alt179=2;
                            int LA179_0 = input.LA(1);

                            if ( (LA179_0==REGULAR_ID) ) {
                                int LA179_1 = input.LA(2);

                                if ( ((input.LT(1).getText().equalsIgnoreCase("escape"))) ) {
                                    alt179=1;
                                }
                            }
                            switch (alt179) {
                                case 1 :
                                    // PLSQL_DMLParser.g:850:38: like_escape_part
                                    {
                                    pushFollow(FOLLOW_like_escape_part_in_compound_expression7876);
                                    like_escape_part557=like_escape_part();

                                    state._fsp--;
                                    if (state.failed) return retval;
                                    if ( state.backtracking==0 ) stream_like_escape_part.add(like_escape_part557.getTree());

                                    }
                                    break;

                            }


                            // AST REWRITE
                            // elements: like_escape_part, like_type, concatenation, like_escape_part, compound_expression, concatenation, compound_expression
                            // token labels: 
                            // rule labels: retval
                            // token list labels: 
                            // rule list labels: 
                            // wildcard labels: 
                            if ( state.backtracking==0 ) {

                            retval.tree = root_0;
                            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

                            root_0 = (Object)adaptor.nil();
                            // 851:17: -> {isNegated}? ^( NOT_LIKE $compound_expression ^( EXPR concatenation ) ( like_escape_part )? )
                            if (isNegated) {
                                // PLSQL_DMLParser.g:851:33: ^( NOT_LIKE $compound_expression ^( EXPR concatenation ) ( like_escape_part )? )
                                {
                                Object root_1 = (Object)adaptor.nil();
                                root_1 = (Object)adaptor.becomeRoot(
                                (Object)adaptor.create(NOT_LIKE, "NOT_LIKE")
                                , root_1);

                                adaptor.addChild(root_1, stream_retval.nextTree());

                                // PLSQL_DMLParser.g:851:65: ^( EXPR concatenation )
                                {
                                Object root_2 = (Object)adaptor.nil();
                                root_2 = (Object)adaptor.becomeRoot(
                                (Object)adaptor.create(EXPR, "EXPR")
                                , root_2);

                                adaptor.addChild(root_2, stream_concatenation.nextTree());

                                adaptor.addChild(root_1, root_2);
                                }

                                // PLSQL_DMLParser.g:851:87: ( like_escape_part )?
                                if ( stream_like_escape_part.hasNext() ) {
                                    adaptor.addChild(root_1, stream_like_escape_part.nextTree());

                                }
                                stream_like_escape_part.reset();

                                adaptor.addChild(root_0, root_1);
                                }

                            }

                            else // 852:17: -> ^( like_type $compound_expression ^( EXPR concatenation ) ( like_escape_part )? )
                            {
                                // PLSQL_DMLParser.g:852:20: ^( like_type $compound_expression ^( EXPR concatenation ) ( like_escape_part )? )
                                {
                                Object root_1 = (Object)adaptor.nil();
                                root_1 = (Object)adaptor.becomeRoot(stream_like_type.nextNode(), root_1);

                                adaptor.addChild(root_1, stream_retval.nextTree());

                                // PLSQL_DMLParser.g:852:54: ^( EXPR concatenation )
                                {
                                Object root_2 = (Object)adaptor.nil();
                                root_2 = (Object)adaptor.becomeRoot(
                                (Object)adaptor.create(EXPR, "EXPR")
                                , root_2);

                                adaptor.addChild(root_2, stream_concatenation.nextTree());

                                adaptor.addChild(root_1, root_2);
                                }

                                // PLSQL_DMLParser.g:852:76: ( like_escape_part )?
                                if ( stream_like_escape_part.hasNext() ) {
                                    adaptor.addChild(root_1, stream_like_escape_part.nextTree());

                                }
                                stream_like_escape_part.reset();

                                adaptor.addChild(root_0, root_1);
                                }

                            }


                            retval.tree = root_0;
                            }

                            }
                            break;

                    }


                    }
                    break;

            }


            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "compound_expression"


    public static class like_type_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "like_type"
    // PLSQL_DMLParser.g:857:1: like_type : ( like_key | likec_key | like2_key | like4_key );
    public final PLSQLParser_PLSQL_DMLParser.like_type_return like_type() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.like_type_return retval = new PLSQLParser_PLSQL_DMLParser.like_type_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        PLSQLParser_PLSQLKeys.like_key_return like_key558 =null;

        PLSQLParser_PLSQLKeys.likec_key_return likec_key559 =null;

        PLSQLParser_PLSQLKeys.like2_key_return like2_key560 =null;

        PLSQLParser_PLSQLKeys.like4_key_return like4_key561 =null;



        try {
            // PLSQL_DMLParser.g:858:5: ( like_key | likec_key | like2_key | like4_key )
            int alt182=4;
            int LA182_0 = input.LA(1);

            if ( (LA182_0==SQL92_RESERVED_LIKE) ) {
                alt182=1;
            }
            else if ( (LA182_0==REGULAR_ID) && (((input.LT(1).getText().equalsIgnoreCase("like4"))||(input.LT(1).getText().equalsIgnoreCase("like2"))||(input.LT(1).getText().equalsIgnoreCase("likec"))))) {
                int LA182_2 = input.LA(2);

                if ( ((input.LT(1).getText().equalsIgnoreCase("likec"))) ) {
                    alt182=2;
                }
                else if ( ((input.LT(1).getText().equalsIgnoreCase("like2"))) ) {
                    alt182=3;
                }
                else if ( ((input.LT(1).getText().equalsIgnoreCase("like4"))) ) {
                    alt182=4;
                }
                else {
                    if (state.backtracking>0) {state.failed=true; return retval;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 182, 2, input);

                    throw nvae;

                }
            }
            else {
                if (state.backtracking>0) {state.failed=true; return retval;}
                NoViableAltException nvae =
                    new NoViableAltException("", 182, 0, input);

                throw nvae;

            }
            switch (alt182) {
                case 1 :
                    // PLSQL_DMLParser.g:858:10: like_key
                    {
                    root_0 = (Object)adaptor.nil();


                    pushFollow(FOLLOW_like_key_in_like_type7985);
                    like_key558=gPLSQLParser.like_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, like_key558.getTree());

                    }
                    break;
                case 2 :
                    // PLSQL_DMLParser.g:859:10: likec_key
                    {
                    root_0 = (Object)adaptor.nil();


                    pushFollow(FOLLOW_likec_key_in_like_type7996);
                    likec_key559=gPLSQLParser.likec_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, likec_key559.getTree());

                    }
                    break;
                case 3 :
                    // PLSQL_DMLParser.g:860:10: like2_key
                    {
                    root_0 = (Object)adaptor.nil();


                    pushFollow(FOLLOW_like2_key_in_like_type8007);
                    like2_key560=gPLSQLParser.like2_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, like2_key560.getTree());

                    }
                    break;
                case 4 :
                    // PLSQL_DMLParser.g:861:10: like4_key
                    {
                    root_0 = (Object)adaptor.nil();


                    pushFollow(FOLLOW_like4_key_in_like_type8018);
                    like4_key561=gPLSQLParser.like4_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, like4_key561.getTree());

                    }
                    break;

            }
            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "like_type"


    public static class like_escape_part_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "like_escape_part"
    // PLSQL_DMLParser.g:864:1: like_escape_part : escape_key concatenation -> ^( EXPR concatenation ) ;
    public final PLSQLParser_PLSQL_DMLParser.like_escape_part_return like_escape_part() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.like_escape_part_return retval = new PLSQLParser_PLSQL_DMLParser.like_escape_part_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        PLSQLParser_PLSQLKeys.escape_key_return escape_key562 =null;

        PLSQLParser_PLSQL_DMLParser.concatenation_return concatenation563 =null;


        RewriteRuleSubtreeStream stream_escape_key=new RewriteRuleSubtreeStream(adaptor,"rule escape_key");
        RewriteRuleSubtreeStream stream_concatenation=new RewriteRuleSubtreeStream(adaptor,"rule concatenation");
        try {
            // PLSQL_DMLParser.g:865:5: ( escape_key concatenation -> ^( EXPR concatenation ) )
            // PLSQL_DMLParser.g:865:10: escape_key concatenation
            {
            pushFollow(FOLLOW_escape_key_in_like_escape_part8038);
            escape_key562=gPLSQLParser.escape_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_escape_key.add(escape_key562.getTree());

            pushFollow(FOLLOW_concatenation_in_like_escape_part8040);
            concatenation563=concatenation();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_concatenation.add(concatenation563.getTree());

            // AST REWRITE
            // elements: concatenation
            // token labels: 
            // rule labels: retval
            // token list labels: 
            // rule list labels: 
            // wildcard labels: 
            if ( state.backtracking==0 ) {

            retval.tree = root_0;
            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

            root_0 = (Object)adaptor.nil();
            // 866:9: -> ^( EXPR concatenation )
            {
                // PLSQL_DMLParser.g:866:12: ^( EXPR concatenation )
                {
                Object root_1 = (Object)adaptor.nil();
                root_1 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(EXPR, "EXPR")
                , root_1);

                adaptor.addChild(root_1, stream_concatenation.nextTree());

                adaptor.addChild(root_0, root_1);
                }

            }


            retval.tree = root_0;
            }

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "like_escape_part"


    public static class in_elements_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "in_elements"
    // PLSQL_DMLParser.g:869:1: in_elements : LEFT_PAREN ( ( select_key )=> subquery | concatenation_wrapper ( COMMA concatenation_wrapper )* ) RIGHT_PAREN -> {mode == 1}? subquery -> ^( EXPR_LIST ( concatenation_wrapper )+ ) ;
    public final PLSQLParser_PLSQL_DMLParser.in_elements_return in_elements() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.in_elements_return retval = new PLSQLParser_PLSQL_DMLParser.in_elements_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token LEFT_PAREN564=null;
        Token COMMA567=null;
        Token RIGHT_PAREN569=null;
        PLSQLParser_PLSQL_DMLParser.subquery_return subquery565 =null;

        PLSQLParser_PLSQL_DMLParser.concatenation_wrapper_return concatenation_wrapper566 =null;

        PLSQLParser_PLSQL_DMLParser.concatenation_wrapper_return concatenation_wrapper568 =null;


        Object LEFT_PAREN564_tree=null;
        Object COMMA567_tree=null;
        Object RIGHT_PAREN569_tree=null;
        RewriteRuleTokenStream stream_LEFT_PAREN=new RewriteRuleTokenStream(adaptor,"token LEFT_PAREN");
        RewriteRuleTokenStream stream_RIGHT_PAREN=new RewriteRuleTokenStream(adaptor,"token RIGHT_PAREN");
        RewriteRuleTokenStream stream_COMMA=new RewriteRuleTokenStream(adaptor,"token COMMA");
        RewriteRuleSubtreeStream stream_concatenation_wrapper=new RewriteRuleSubtreeStream(adaptor,"rule concatenation_wrapper");
        RewriteRuleSubtreeStream stream_subquery=new RewriteRuleSubtreeStream(adaptor,"rule subquery");
            int mode = 0;    
        try {
            // PLSQL_DMLParser.g:871:5: ( LEFT_PAREN ( ( select_key )=> subquery | concatenation_wrapper ( COMMA concatenation_wrapper )* ) RIGHT_PAREN -> {mode == 1}? subquery -> ^( EXPR_LIST ( concatenation_wrapper )+ ) )
            // PLSQL_DMLParser.g:871:10: LEFT_PAREN ( ( select_key )=> subquery | concatenation_wrapper ( COMMA concatenation_wrapper )* ) RIGHT_PAREN
            {
            LEFT_PAREN564=(Token)match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_in_elements8084); if (state.failed) return retval; 
            if ( state.backtracking==0 ) stream_LEFT_PAREN.add(LEFT_PAREN564);


            // PLSQL_DMLParser.g:871:21: ( ( select_key )=> subquery | concatenation_wrapper ( COMMA concatenation_wrapper )* )
            int alt184=2;
            int LA184_0 = input.LA(1);

            if ( (LA184_0==SQL92_RESERVED_SELECT) && (synpred15_PLSQL_DMLParser())) {
                alt184=1;
            }
            else if ( (LA184_0==LEFT_PAREN) ) {
                int LA184_2 = input.LA(2);

                if ( (synpred15_PLSQL_DMLParser()) ) {
                    alt184=1;
                }
                else if ( (true) ) {
                    alt184=2;
                }
                else {
                    if (state.backtracking>0) {state.failed=true; return retval;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 184, 2, input);

                    throw nvae;

                }
            }
            else if ( (LA184_0==APPROXIMATE_NUM_LIT||(LA184_0 >= CHAR_STRING && LA184_0 <= COLON)||LA184_0==DELIMITED_ID||LA184_0==EXACT_NUM_LIT||LA184_0==INTRODUCER||LA184_0==MINUS_SIGN||LA184_0==PLUS_SIGN||LA184_0==REGULAR_ID||LA184_0==SQL92_RESERVED_ALL||LA184_0==SQL92_RESERVED_ANY||LA184_0==SQL92_RESERVED_CASE||LA184_0==SQL92_RESERVED_DEFAULT||LA184_0==SQL92_RESERVED_DISTINCT||(LA184_0 >= SQL92_RESERVED_EXISTS && LA184_0 <= SQL92_RESERVED_FALSE)||LA184_0==SQL92_RESERVED_NULL||LA184_0==SQL92_RESERVED_PRIOR||LA184_0==SQL92_RESERVED_TRUE||LA184_0==UNSIGNED_INTEGER) ) {
                alt184=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return retval;}
                NoViableAltException nvae =
                    new NoViableAltException("", 184, 0, input);

                throw nvae;

            }
            switch (alt184) {
                case 1 :
                    // PLSQL_DMLParser.g:871:22: ( select_key )=> subquery
                    {
                    pushFollow(FOLLOW_subquery_in_in_elements8092);
                    subquery565=subquery();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_subquery.add(subquery565.getTree());

                    if ( state.backtracking==0 ) {mode = 1;}

                    }
                    break;
                case 2 :
                    // PLSQL_DMLParser.g:871:60: concatenation_wrapper ( COMMA concatenation_wrapper )*
                    {
                    pushFollow(FOLLOW_concatenation_wrapper_in_in_elements8098);
                    concatenation_wrapper566=concatenation_wrapper();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_concatenation_wrapper.add(concatenation_wrapper566.getTree());

                    // PLSQL_DMLParser.g:871:82: ( COMMA concatenation_wrapper )*
                    loop183:
                    do {
                        int alt183=2;
                        int LA183_0 = input.LA(1);

                        if ( (LA183_0==COMMA) ) {
                            alt183=1;
                        }


                        switch (alt183) {
                    	case 1 :
                    	    // PLSQL_DMLParser.g:871:83: COMMA concatenation_wrapper
                    	    {
                    	    COMMA567=(Token)match(input,COMMA,FOLLOW_COMMA_in_in_elements8101); if (state.failed) return retval; 
                    	    if ( state.backtracking==0 ) stream_COMMA.add(COMMA567);


                    	    pushFollow(FOLLOW_concatenation_wrapper_in_in_elements8103);
                    	    concatenation_wrapper568=concatenation_wrapper();

                    	    state._fsp--;
                    	    if (state.failed) return retval;
                    	    if ( state.backtracking==0 ) stream_concatenation_wrapper.add(concatenation_wrapper568.getTree());

                    	    }
                    	    break;

                    	default :
                    	    break loop183;
                        }
                    } while (true);


                    }
                    break;

            }


            RIGHT_PAREN569=(Token)match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_in_elements8109); if (state.failed) return retval; 
            if ( state.backtracking==0 ) stream_RIGHT_PAREN.add(RIGHT_PAREN569);


            // AST REWRITE
            // elements: subquery, concatenation_wrapper
            // token labels: 
            // rule labels: retval
            // token list labels: 
            // rule list labels: 
            // wildcard labels: 
            if ( state.backtracking==0 ) {

            retval.tree = root_0;
            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

            root_0 = (Object)adaptor.nil();
            // 872:9: -> {mode == 1}? subquery
            if (mode == 1) {
                adaptor.addChild(root_0, stream_subquery.nextTree());

            }

            else // 873:9: -> ^( EXPR_LIST ( concatenation_wrapper )+ )
            {
                // PLSQL_DMLParser.g:873:12: ^( EXPR_LIST ( concatenation_wrapper )+ )
                {
                Object root_1 = (Object)adaptor.nil();
                root_1 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(EXPR_LIST, "EXPR_LIST")
                , root_1);

                if ( !(stream_concatenation_wrapper.hasNext()) ) {
                    throw new RewriteEarlyExitException();
                }
                while ( stream_concatenation_wrapper.hasNext() ) {
                    adaptor.addChild(root_1, stream_concatenation_wrapper.nextTree());

                }
                stream_concatenation_wrapper.reset();

                adaptor.addChild(root_0, root_1);
                }

            }


            retval.tree = root_0;
            }

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "in_elements"


    public static class between_elements_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "between_elements"
    // PLSQL_DMLParser.g:876:1: between_elements : cn1= concatenation and_key cn2= concatenation -> ^( EXPR $cn1) ^( EXPR $cn2) ;
    public final PLSQLParser_PLSQL_DMLParser.between_elements_return between_elements() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.between_elements_return retval = new PLSQLParser_PLSQL_DMLParser.between_elements_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        PLSQLParser_PLSQL_DMLParser.concatenation_return cn1 =null;

        PLSQLParser_PLSQL_DMLParser.concatenation_return cn2 =null;

        PLSQLParser_PLSQLKeys.and_key_return and_key570 =null;


        RewriteRuleSubtreeStream stream_and_key=new RewriteRuleSubtreeStream(adaptor,"rule and_key");
        RewriteRuleSubtreeStream stream_concatenation=new RewriteRuleSubtreeStream(adaptor,"rule concatenation");
        try {
            // PLSQL_DMLParser.g:877:5: (cn1= concatenation and_key cn2= concatenation -> ^( EXPR $cn1) ^( EXPR $cn2) )
            // PLSQL_DMLParser.g:877:10: cn1= concatenation and_key cn2= concatenation
            {
            pushFollow(FOLLOW_concatenation_in_between_elements8162);
            cn1=concatenation();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_concatenation.add(cn1.getTree());

            pushFollow(FOLLOW_and_key_in_between_elements8164);
            and_key570=gPLSQLParser.and_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_and_key.add(and_key570.getTree());

            pushFollow(FOLLOW_concatenation_in_between_elements8168);
            cn2=concatenation();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_concatenation.add(cn2.getTree());

            // AST REWRITE
            // elements: cn2, cn1
            // token labels: 
            // rule labels: retval, cn2, cn1
            // token list labels: 
            // rule list labels: 
            // wildcard labels: 
            if ( state.backtracking==0 ) {

            retval.tree = root_0;
            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);
            RewriteRuleSubtreeStream stream_cn2=new RewriteRuleSubtreeStream(adaptor,"rule cn2",cn2!=null?cn2.tree:null);
            RewriteRuleSubtreeStream stream_cn1=new RewriteRuleSubtreeStream(adaptor,"rule cn1",cn1!=null?cn1.tree:null);

            root_0 = (Object)adaptor.nil();
            // 878:9: -> ^( EXPR $cn1) ^( EXPR $cn2)
            {
                // PLSQL_DMLParser.g:878:12: ^( EXPR $cn1)
                {
                Object root_1 = (Object)adaptor.nil();
                root_1 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(EXPR, "EXPR")
                , root_1);

                adaptor.addChild(root_1, stream_cn1.nextTree());

                adaptor.addChild(root_0, root_1);
                }

                // PLSQL_DMLParser.g:878:25: ^( EXPR $cn2)
                {
                Object root_1 = (Object)adaptor.nil();
                root_1 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(EXPR, "EXPR")
                , root_1);

                adaptor.addChild(root_1, stream_cn2.nextTree());

                adaptor.addChild(root_0, root_1);
                }

            }


            retval.tree = root_0;
            }

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "between_elements"


    public static class concatenation_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "concatenation"
    // PLSQL_DMLParser.g:881:1: concatenation : additive_expression ( CONCATENATION_OP ^ additive_expression )* ;
    public final PLSQLParser_PLSQL_DMLParser.concatenation_return concatenation() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.concatenation_return retval = new PLSQLParser_PLSQL_DMLParser.concatenation_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token CONCATENATION_OP572=null;
        PLSQLParser_PLSQL_DMLParser.additive_expression_return additive_expression571 =null;

        PLSQLParser_PLSQL_DMLParser.additive_expression_return additive_expression573 =null;


        Object CONCATENATION_OP572_tree=null;

        try {
            // PLSQL_DMLParser.g:882:5: ( additive_expression ( CONCATENATION_OP ^ additive_expression )* )
            // PLSQL_DMLParser.g:882:10: additive_expression ( CONCATENATION_OP ^ additive_expression )*
            {
            root_0 = (Object)adaptor.nil();


            pushFollow(FOLLOW_additive_expression_in_concatenation8213);
            additive_expression571=additive_expression();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) adaptor.addChild(root_0, additive_expression571.getTree());

            // PLSQL_DMLParser.g:882:30: ( CONCATENATION_OP ^ additive_expression )*
            loop185:
            do {
                int alt185=2;
                int LA185_0 = input.LA(1);

                if ( (LA185_0==CONCATENATION_OP) ) {
                    alt185=1;
                }


                switch (alt185) {
            	case 1 :
            	    // PLSQL_DMLParser.g:882:31: CONCATENATION_OP ^ additive_expression
            	    {
            	    CONCATENATION_OP572=(Token)match(input,CONCATENATION_OP,FOLLOW_CONCATENATION_OP_in_concatenation8216); if (state.failed) return retval;
            	    if ( state.backtracking==0 ) {
            	    CONCATENATION_OP572_tree = 
            	    (Object)adaptor.create(CONCATENATION_OP572)
            	    ;
            	    root_0 = (Object)adaptor.becomeRoot(CONCATENATION_OP572_tree, root_0);
            	    }

            	    pushFollow(FOLLOW_additive_expression_in_concatenation8219);
            	    additive_expression573=additive_expression();

            	    state._fsp--;
            	    if (state.failed) return retval;
            	    if ( state.backtracking==0 ) adaptor.addChild(root_0, additive_expression573.getTree());

            	    }
            	    break;

            	default :
            	    break loop185;
                }
            } while (true);


            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "concatenation"


    public static class concatenation_wrapper_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "concatenation_wrapper"
    // PLSQL_DMLParser.g:885:1: concatenation_wrapper : concatenation -> ^( EXPR concatenation ) ;
    public final PLSQLParser_PLSQL_DMLParser.concatenation_wrapper_return concatenation_wrapper() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.concatenation_wrapper_return retval = new PLSQLParser_PLSQL_DMLParser.concatenation_wrapper_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        PLSQLParser_PLSQL_DMLParser.concatenation_return concatenation574 =null;


        RewriteRuleSubtreeStream stream_concatenation=new RewriteRuleSubtreeStream(adaptor,"rule concatenation");
        try {
            // PLSQL_DMLParser.g:886:5: ( concatenation -> ^( EXPR concatenation ) )
            // PLSQL_DMLParser.g:886:10: concatenation
            {
            pushFollow(FOLLOW_concatenation_in_concatenation_wrapper8241);
            concatenation574=concatenation();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_concatenation.add(concatenation574.getTree());

            // AST REWRITE
            // elements: concatenation
            // token labels: 
            // rule labels: retval
            // token list labels: 
            // rule list labels: 
            // wildcard labels: 
            if ( state.backtracking==0 ) {

            retval.tree = root_0;
            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

            root_0 = (Object)adaptor.nil();
            // 887:9: -> ^( EXPR concatenation )
            {
                // PLSQL_DMLParser.g:887:12: ^( EXPR concatenation )
                {
                Object root_1 = (Object)adaptor.nil();
                root_1 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(EXPR, "EXPR")
                , root_1);

                adaptor.addChild(root_1, stream_concatenation.nextTree());

                adaptor.addChild(root_0, root_1);
                }

            }


            retval.tree = root_0;
            }

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "concatenation_wrapper"


    public static class additive_expression_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "additive_expression"
    // PLSQL_DMLParser.g:890:1: additive_expression : multiply_expression ( ( PLUS_SIGN ^| MINUS_SIGN ^) multiply_expression )* ;
    public final PLSQLParser_PLSQL_DMLParser.additive_expression_return additive_expression() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.additive_expression_return retval = new PLSQLParser_PLSQL_DMLParser.additive_expression_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token PLUS_SIGN576=null;
        Token MINUS_SIGN577=null;
        PLSQLParser_PLSQL_DMLParser.multiply_expression_return multiply_expression575 =null;

        PLSQLParser_PLSQL_DMLParser.multiply_expression_return multiply_expression578 =null;


        Object PLUS_SIGN576_tree=null;
        Object MINUS_SIGN577_tree=null;

        try {
            // PLSQL_DMLParser.g:891:5: ( multiply_expression ( ( PLUS_SIGN ^| MINUS_SIGN ^) multiply_expression )* )
            // PLSQL_DMLParser.g:891:10: multiply_expression ( ( PLUS_SIGN ^| MINUS_SIGN ^) multiply_expression )*
            {
            root_0 = (Object)adaptor.nil();


            pushFollow(FOLLOW_multiply_expression_in_additive_expression8277);
            multiply_expression575=multiply_expression();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) adaptor.addChild(root_0, multiply_expression575.getTree());

            // PLSQL_DMLParser.g:891:30: ( ( PLUS_SIGN ^| MINUS_SIGN ^) multiply_expression )*
            loop187:
            do {
                int alt187=2;
                int LA187_0 = input.LA(1);

                if ( (LA187_0==PLUS_SIGN) ) {
                    alt187=1;
                }
                else if ( (LA187_0==MINUS_SIGN) ) {
                    alt187=1;
                }


                switch (alt187) {
            	case 1 :
            	    // PLSQL_DMLParser.g:891:32: ( PLUS_SIGN ^| MINUS_SIGN ^) multiply_expression
            	    {
            	    // PLSQL_DMLParser.g:891:32: ( PLUS_SIGN ^| MINUS_SIGN ^)
            	    int alt186=2;
            	    int LA186_0 = input.LA(1);

            	    if ( (LA186_0==PLUS_SIGN) ) {
            	        alt186=1;
            	    }
            	    else if ( (LA186_0==MINUS_SIGN) ) {
            	        alt186=2;
            	    }
            	    else {
            	        if (state.backtracking>0) {state.failed=true; return retval;}
            	        NoViableAltException nvae =
            	            new NoViableAltException("", 186, 0, input);

            	        throw nvae;

            	    }
            	    switch (alt186) {
            	        case 1 :
            	            // PLSQL_DMLParser.g:891:34: PLUS_SIGN ^
            	            {
            	            PLUS_SIGN576=(Token)match(input,PLUS_SIGN,FOLLOW_PLUS_SIGN_in_additive_expression8283); if (state.failed) return retval;
            	            if ( state.backtracking==0 ) {
            	            PLUS_SIGN576_tree = 
            	            (Object)adaptor.create(PLUS_SIGN576)
            	            ;
            	            root_0 = (Object)adaptor.becomeRoot(PLUS_SIGN576_tree, root_0);
            	            }

            	            }
            	            break;
            	        case 2 :
            	            // PLSQL_DMLParser.g:891:47: MINUS_SIGN ^
            	            {
            	            MINUS_SIGN577=(Token)match(input,MINUS_SIGN,FOLLOW_MINUS_SIGN_in_additive_expression8288); if (state.failed) return retval;
            	            if ( state.backtracking==0 ) {
            	            MINUS_SIGN577_tree = 
            	            (Object)adaptor.create(MINUS_SIGN577)
            	            ;
            	            root_0 = (Object)adaptor.becomeRoot(MINUS_SIGN577_tree, root_0);
            	            }

            	            }
            	            break;

            	    }


            	    pushFollow(FOLLOW_multiply_expression_in_additive_expression8293);
            	    multiply_expression578=multiply_expression();

            	    state._fsp--;
            	    if (state.failed) return retval;
            	    if ( state.backtracking==0 ) adaptor.addChild(root_0, multiply_expression578.getTree());

            	    }
            	    break;

            	default :
            	    break loop187;
                }
            } while (true);


            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "additive_expression"


    public static class multiply_expression_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "multiply_expression"
    // PLSQL_DMLParser.g:894:1: multiply_expression : datetime_expression ( ( ASTERISK ^| SOLIDUS ^) datetime_expression )* ;
    public final PLSQLParser_PLSQL_DMLParser.multiply_expression_return multiply_expression() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.multiply_expression_return retval = new PLSQLParser_PLSQL_DMLParser.multiply_expression_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token ASTERISK580=null;
        Token SOLIDUS581=null;
        PLSQLParser_PLSQL_DMLParser.datetime_expression_return datetime_expression579 =null;

        PLSQLParser_PLSQL_DMLParser.datetime_expression_return datetime_expression582 =null;


        Object ASTERISK580_tree=null;
        Object SOLIDUS581_tree=null;

        try {
            // PLSQL_DMLParser.g:895:5: ( datetime_expression ( ( ASTERISK ^| SOLIDUS ^) datetime_expression )* )
            // PLSQL_DMLParser.g:895:10: datetime_expression ( ( ASTERISK ^| SOLIDUS ^) datetime_expression )*
            {
            root_0 = (Object)adaptor.nil();


            pushFollow(FOLLOW_datetime_expression_in_multiply_expression8315);
            datetime_expression579=datetime_expression();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) adaptor.addChild(root_0, datetime_expression579.getTree());

            // PLSQL_DMLParser.g:895:30: ( ( ASTERISK ^| SOLIDUS ^) datetime_expression )*
            loop189:
            do {
                int alt189=2;
                int LA189_0 = input.LA(1);

                if ( (LA189_0==ASTERISK) ) {
                    alt189=1;
                }
                else if ( (LA189_0==SOLIDUS) ) {
                    alt189=1;
                }


                switch (alt189) {
            	case 1 :
            	    // PLSQL_DMLParser.g:895:32: ( ASTERISK ^| SOLIDUS ^) datetime_expression
            	    {
            	    // PLSQL_DMLParser.g:895:32: ( ASTERISK ^| SOLIDUS ^)
            	    int alt188=2;
            	    int LA188_0 = input.LA(1);

            	    if ( (LA188_0==ASTERISK) ) {
            	        alt188=1;
            	    }
            	    else if ( (LA188_0==SOLIDUS) ) {
            	        alt188=2;
            	    }
            	    else {
            	        if (state.backtracking>0) {state.failed=true; return retval;}
            	        NoViableAltException nvae =
            	            new NoViableAltException("", 188, 0, input);

            	        throw nvae;

            	    }
            	    switch (alt188) {
            	        case 1 :
            	            // PLSQL_DMLParser.g:895:34: ASTERISK ^
            	            {
            	            ASTERISK580=(Token)match(input,ASTERISK,FOLLOW_ASTERISK_in_multiply_expression8321); if (state.failed) return retval;
            	            if ( state.backtracking==0 ) {
            	            ASTERISK580_tree = 
            	            (Object)adaptor.create(ASTERISK580)
            	            ;
            	            root_0 = (Object)adaptor.becomeRoot(ASTERISK580_tree, root_0);
            	            }

            	            }
            	            break;
            	        case 2 :
            	            // PLSQL_DMLParser.g:895:46: SOLIDUS ^
            	            {
            	            SOLIDUS581=(Token)match(input,SOLIDUS,FOLLOW_SOLIDUS_in_multiply_expression8326); if (state.failed) return retval;
            	            if ( state.backtracking==0 ) {
            	            SOLIDUS581_tree = 
            	            (Object)adaptor.create(SOLIDUS581)
            	            ;
            	            root_0 = (Object)adaptor.becomeRoot(SOLIDUS581_tree, root_0);
            	            }

            	            }
            	            break;

            	    }


            	    pushFollow(FOLLOW_datetime_expression_in_multiply_expression8331);
            	    datetime_expression582=datetime_expression();

            	    state._fsp--;
            	    if (state.failed) return retval;
            	    if ( state.backtracking==0 ) adaptor.addChild(root_0, datetime_expression582.getTree());

            	    }
            	    break;

            	default :
            	    break loop189;
                }
            } while (true);


            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "multiply_expression"


    public static class datetime_expression_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "datetime_expression"
    // PLSQL_DMLParser.g:898:1: datetime_expression : ( model_expression -> model_expression ) ( at_key ( local_key | time_key zone_key concatenation_wrapper ) -> ^( DATETIME_OP $datetime_expression ^( at_key ( local_key )? ( time_key )? concatenation_wrapper ) ) | ( interval_expression )=> interval_expression -> ^( DATETIME_OP $datetime_expression interval_expression ) )? ;
    public final PLSQLParser_PLSQL_DMLParser.datetime_expression_return datetime_expression() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.datetime_expression_return retval = new PLSQLParser_PLSQL_DMLParser.datetime_expression_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        PLSQLParser_PLSQL_DMLParser.model_expression_return model_expression583 =null;

        PLSQLParser_PLSQLKeys.at_key_return at_key584 =null;

        PLSQLParser_PLSQLKeys.local_key_return local_key585 =null;

        PLSQLParser_PLSQLKeys.time_key_return time_key586 =null;

        PLSQLParser_PLSQLKeys.zone_key_return zone_key587 =null;

        PLSQLParser_PLSQL_DMLParser.concatenation_wrapper_return concatenation_wrapper588 =null;

        PLSQLParser_PLSQL_DMLParser.interval_expression_return interval_expression589 =null;


        RewriteRuleSubtreeStream stream_at_key=new RewriteRuleSubtreeStream(adaptor,"rule at_key");
        RewriteRuleSubtreeStream stream_concatenation_wrapper=new RewriteRuleSubtreeStream(adaptor,"rule concatenation_wrapper");
        RewriteRuleSubtreeStream stream_model_expression=new RewriteRuleSubtreeStream(adaptor,"rule model_expression");
        RewriteRuleSubtreeStream stream_local_key=new RewriteRuleSubtreeStream(adaptor,"rule local_key");
        RewriteRuleSubtreeStream stream_zone_key=new RewriteRuleSubtreeStream(adaptor,"rule zone_key");
        RewriteRuleSubtreeStream stream_interval_expression=new RewriteRuleSubtreeStream(adaptor,"rule interval_expression");
        RewriteRuleSubtreeStream stream_time_key=new RewriteRuleSubtreeStream(adaptor,"rule time_key");
        try {
            // PLSQL_DMLParser.g:899:5: ( ( model_expression -> model_expression ) ( at_key ( local_key | time_key zone_key concatenation_wrapper ) -> ^( DATETIME_OP $datetime_expression ^( at_key ( local_key )? ( time_key )? concatenation_wrapper ) ) | ( interval_expression )=> interval_expression -> ^( DATETIME_OP $datetime_expression interval_expression ) )? )
            // PLSQL_DMLParser.g:899:10: ( model_expression -> model_expression ) ( at_key ( local_key | time_key zone_key concatenation_wrapper ) -> ^( DATETIME_OP $datetime_expression ^( at_key ( local_key )? ( time_key )? concatenation_wrapper ) ) | ( interval_expression )=> interval_expression -> ^( DATETIME_OP $datetime_expression interval_expression ) )?
            {
            // PLSQL_DMLParser.g:899:10: ( model_expression -> model_expression )
            // PLSQL_DMLParser.g:899:11: model_expression
            {
            pushFollow(FOLLOW_model_expression_in_datetime_expression8354);
            model_expression583=model_expression();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_model_expression.add(model_expression583.getTree());

            // AST REWRITE
            // elements: model_expression
            // token labels: 
            // rule labels: retval
            // token list labels: 
            // rule list labels: 
            // wildcard labels: 
            if ( state.backtracking==0 ) {

            retval.tree = root_0;
            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

            root_0 = (Object)adaptor.nil();
            // 899:28: -> model_expression
            {
                adaptor.addChild(root_0, stream_model_expression.nextTree());

            }


            retval.tree = root_0;
            }

            }


            // PLSQL_DMLParser.g:900:5: ( at_key ( local_key | time_key zone_key concatenation_wrapper ) -> ^( DATETIME_OP $datetime_expression ^( at_key ( local_key )? ( time_key )? concatenation_wrapper ) ) | ( interval_expression )=> interval_expression -> ^( DATETIME_OP $datetime_expression interval_expression ) )?
            int alt191=3;
            int LA191_0 = input.LA(1);

            if ( (LA191_0==REGULAR_ID) ) {
                int LA191_1 = input.LA(2);

                if ( ((input.LT(1).getText().equalsIgnoreCase("at"))) ) {
                    alt191=1;
                }
                else if ( (((((input.LT(1).getText().equalsIgnoreCase("day"))||(input.LT(1).getText().equalsIgnoreCase("year")))&&((input.LT(1).getText().equalsIgnoreCase("day"))||(input.LT(1).getText().equalsIgnoreCase("year"))))&&synpred16_PLSQL_DMLParser())) ) {
                    alt191=2;
                }
            }
            switch (alt191) {
                case 1 :
                    // PLSQL_DMLParser.g:900:10: at_key ( local_key | time_key zone_key concatenation_wrapper )
                    {
                    pushFollow(FOLLOW_at_key_in_datetime_expression8370);
                    at_key584=gPLSQLParser.at_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_at_key.add(at_key584.getTree());

                    // PLSQL_DMLParser.g:900:17: ( local_key | time_key zone_key concatenation_wrapper )
                    int alt190=2;
                    int LA190_0 = input.LA(1);

                    if ( (LA190_0==REGULAR_ID) ) {
                        int LA190_1 = input.LA(2);

                        if ( ((input.LT(1).getText().equalsIgnoreCase("local"))) ) {
                            alt190=1;
                        }
                        else if ( ((input.LT(1).getText().equalsIgnoreCase("time"))) ) {
                            alt190=2;
                        }
                        else {
                            if (state.backtracking>0) {state.failed=true; return retval;}
                            NoViableAltException nvae =
                                new NoViableAltException("", 190, 1, input);

                            throw nvae;

                        }
                    }
                    else {
                        if (state.backtracking>0) {state.failed=true; return retval;}
                        NoViableAltException nvae =
                            new NoViableAltException("", 190, 0, input);

                        throw nvae;

                    }
                    switch (alt190) {
                        case 1 :
                            // PLSQL_DMLParser.g:900:18: local_key
                            {
                            pushFollow(FOLLOW_local_key_in_datetime_expression8373);
                            local_key585=gPLSQLParser.local_key();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) stream_local_key.add(local_key585.getTree());

                            }
                            break;
                        case 2 :
                            // PLSQL_DMLParser.g:900:28: time_key zone_key concatenation_wrapper
                            {
                            pushFollow(FOLLOW_time_key_in_datetime_expression8375);
                            time_key586=gPLSQLParser.time_key();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) stream_time_key.add(time_key586.getTree());

                            pushFollow(FOLLOW_zone_key_in_datetime_expression8377);
                            zone_key587=gPLSQLParser.zone_key();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) stream_zone_key.add(zone_key587.getTree());

                            pushFollow(FOLLOW_concatenation_wrapper_in_datetime_expression8379);
                            concatenation_wrapper588=concatenation_wrapper();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) stream_concatenation_wrapper.add(concatenation_wrapper588.getTree());

                            }
                            break;

                    }


                    // AST REWRITE
                    // elements: datetime_expression, at_key, time_key, local_key, concatenation_wrapper
                    // token labels: 
                    // rule labels: retval
                    // token list labels: 
                    // rule list labels: 
                    // wildcard labels: 
                    if ( state.backtracking==0 ) {

                    retval.tree = root_0;
                    RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

                    root_0 = (Object)adaptor.nil();
                    // 901:13: -> ^( DATETIME_OP $datetime_expression ^( at_key ( local_key )? ( time_key )? concatenation_wrapper ) )
                    {
                        // PLSQL_DMLParser.g:901:16: ^( DATETIME_OP $datetime_expression ^( at_key ( local_key )? ( time_key )? concatenation_wrapper ) )
                        {
                        Object root_1 = (Object)adaptor.nil();
                        root_1 = (Object)adaptor.becomeRoot(
                        (Object)adaptor.create(DATETIME_OP, "DATETIME_OP")
                        , root_1);

                        adaptor.addChild(root_1, stream_retval.nextTree());

                        // PLSQL_DMLParser.g:901:51: ^( at_key ( local_key )? ( time_key )? concatenation_wrapper )
                        {
                        Object root_2 = (Object)adaptor.nil();
                        root_2 = (Object)adaptor.becomeRoot(stream_at_key.nextNode(), root_2);

                        // PLSQL_DMLParser.g:901:60: ( local_key )?
                        if ( stream_local_key.hasNext() ) {
                            adaptor.addChild(root_2, stream_local_key.nextTree());

                        }
                        stream_local_key.reset();

                        // PLSQL_DMLParser.g:901:71: ( time_key )?
                        if ( stream_time_key.hasNext() ) {
                            adaptor.addChild(root_2, stream_time_key.nextTree());

                        }
                        stream_time_key.reset();

                        adaptor.addChild(root_2, stream_concatenation_wrapper.nextTree());

                        adaptor.addChild(root_1, root_2);
                        }

                        adaptor.addChild(root_0, root_1);
                        }

                    }


                    retval.tree = root_0;
                    }

                    }
                    break;
                case 2 :
                    // PLSQL_DMLParser.g:902:10: ( interval_expression )=> interval_expression
                    {
                    pushFollow(FOLLOW_interval_expression_in_datetime_expression8429);
                    interval_expression589=interval_expression();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_interval_expression.add(interval_expression589.getTree());

                    // AST REWRITE
                    // elements: interval_expression, datetime_expression
                    // token labels: 
                    // rule labels: retval
                    // token list labels: 
                    // rule list labels: 
                    // wildcard labels: 
                    if ( state.backtracking==0 ) {

                    retval.tree = root_0;
                    RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

                    root_0 = (Object)adaptor.nil();
                    // 903:13: -> ^( DATETIME_OP $datetime_expression interval_expression )
                    {
                        // PLSQL_DMLParser.g:903:16: ^( DATETIME_OP $datetime_expression interval_expression )
                        {
                        Object root_1 = (Object)adaptor.nil();
                        root_1 = (Object)adaptor.becomeRoot(
                        (Object)adaptor.create(DATETIME_OP, "DATETIME_OP")
                        , root_1);

                        adaptor.addChild(root_1, stream_retval.nextTree());

                        adaptor.addChild(root_1, stream_interval_expression.nextTree());

                        adaptor.addChild(root_0, root_1);
                        }

                    }


                    retval.tree = root_0;
                    }

                    }
                    break;

            }


            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "datetime_expression"


    public static class interval_expression_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "interval_expression"
    // PLSQL_DMLParser.g:907:1: interval_expression : ( day_key ( LEFT_PAREN cn1= concatenation_wrapper RIGHT_PAREN )? to_key second_key ( LEFT_PAREN cn2= concatenation_wrapper RIGHT_PAREN )? -> ^( day_key second_key ( $cn1)? ( $cn2)? ) | year_key ( LEFT_PAREN concatenation_wrapper RIGHT_PAREN )? to_key month_key -> ^( year_key month_key concatenation_wrapper ) );
    public final PLSQLParser_PLSQL_DMLParser.interval_expression_return interval_expression() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.interval_expression_return retval = new PLSQLParser_PLSQL_DMLParser.interval_expression_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token LEFT_PAREN591=null;
        Token RIGHT_PAREN592=null;
        Token LEFT_PAREN595=null;
        Token RIGHT_PAREN596=null;
        Token LEFT_PAREN598=null;
        Token RIGHT_PAREN600=null;
        PLSQLParser_PLSQL_DMLParser.concatenation_wrapper_return cn1 =null;

        PLSQLParser_PLSQL_DMLParser.concatenation_wrapper_return cn2 =null;

        PLSQLParser_PLSQLKeys.day_key_return day_key590 =null;

        PLSQLParser_PLSQLKeys.to_key_return to_key593 =null;

        PLSQLParser_PLSQLKeys.second_key_return second_key594 =null;

        PLSQLParser_PLSQLKeys.year_key_return year_key597 =null;

        PLSQLParser_PLSQL_DMLParser.concatenation_wrapper_return concatenation_wrapper599 =null;

        PLSQLParser_PLSQLKeys.to_key_return to_key601 =null;

        PLSQLParser_PLSQLKeys.month_key_return month_key602 =null;


        Object LEFT_PAREN591_tree=null;
        Object RIGHT_PAREN592_tree=null;
        Object LEFT_PAREN595_tree=null;
        Object RIGHT_PAREN596_tree=null;
        Object LEFT_PAREN598_tree=null;
        Object RIGHT_PAREN600_tree=null;
        RewriteRuleTokenStream stream_LEFT_PAREN=new RewriteRuleTokenStream(adaptor,"token LEFT_PAREN");
        RewriteRuleTokenStream stream_RIGHT_PAREN=new RewriteRuleTokenStream(adaptor,"token RIGHT_PAREN");
        RewriteRuleSubtreeStream stream_year_key=new RewriteRuleSubtreeStream(adaptor,"rule year_key");
        RewriteRuleSubtreeStream stream_day_key=new RewriteRuleSubtreeStream(adaptor,"rule day_key");
        RewriteRuleSubtreeStream stream_second_key=new RewriteRuleSubtreeStream(adaptor,"rule second_key");
        RewriteRuleSubtreeStream stream_concatenation_wrapper=new RewriteRuleSubtreeStream(adaptor,"rule concatenation_wrapper");
        RewriteRuleSubtreeStream stream_to_key=new RewriteRuleSubtreeStream(adaptor,"rule to_key");
        RewriteRuleSubtreeStream stream_month_key=new RewriteRuleSubtreeStream(adaptor,"rule month_key");
        try {
            // PLSQL_DMLParser.g:908:5: ( day_key ( LEFT_PAREN cn1= concatenation_wrapper RIGHT_PAREN )? to_key second_key ( LEFT_PAREN cn2= concatenation_wrapper RIGHT_PAREN )? -> ^( day_key second_key ( $cn1)? ( $cn2)? ) | year_key ( LEFT_PAREN concatenation_wrapper RIGHT_PAREN )? to_key month_key -> ^( year_key month_key concatenation_wrapper ) )
            int alt195=2;
            int LA195_0 = input.LA(1);

            if ( (LA195_0==REGULAR_ID) && (((input.LT(1).getText().equalsIgnoreCase("day"))||(input.LT(1).getText().equalsIgnoreCase("year"))))) {
                int LA195_1 = input.LA(2);

                if ( ((input.LT(1).getText().equalsIgnoreCase("day"))) ) {
                    alt195=1;
                }
                else if ( ((input.LT(1).getText().equalsIgnoreCase("year"))) ) {
                    alt195=2;
                }
                else {
                    if (state.backtracking>0) {state.failed=true; return retval;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 195, 1, input);

                    throw nvae;

                }
            }
            else {
                if (state.backtracking>0) {state.failed=true; return retval;}
                NoViableAltException nvae =
                    new NoViableAltException("", 195, 0, input);

                throw nvae;

            }
            switch (alt195) {
                case 1 :
                    // PLSQL_DMLParser.g:908:10: day_key ( LEFT_PAREN cn1= concatenation_wrapper RIGHT_PAREN )? to_key second_key ( LEFT_PAREN cn2= concatenation_wrapper RIGHT_PAREN )?
                    {
                    pushFollow(FOLLOW_day_key_in_interval_expression8479);
                    day_key590=gPLSQLParser.day_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_day_key.add(day_key590.getTree());

                    // PLSQL_DMLParser.g:908:21: ( LEFT_PAREN cn1= concatenation_wrapper RIGHT_PAREN )?
                    int alt192=2;
                    int LA192_0 = input.LA(1);

                    if ( (LA192_0==LEFT_PAREN) ) {
                        alt192=1;
                    }
                    switch (alt192) {
                        case 1 :
                            // PLSQL_DMLParser.g:908:22: LEFT_PAREN cn1= concatenation_wrapper RIGHT_PAREN
                            {
                            LEFT_PAREN591=(Token)match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_interval_expression8485); if (state.failed) return retval; 
                            if ( state.backtracking==0 ) stream_LEFT_PAREN.add(LEFT_PAREN591);


                            pushFollow(FOLLOW_concatenation_wrapper_in_interval_expression8489);
                            cn1=concatenation_wrapper();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) stream_concatenation_wrapper.add(cn1.getTree());

                            RIGHT_PAREN592=(Token)match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_interval_expression8491); if (state.failed) return retval; 
                            if ( state.backtracking==0 ) stream_RIGHT_PAREN.add(RIGHT_PAREN592);


                            }
                            break;

                    }


                    pushFollow(FOLLOW_to_key_in_interval_expression8495);
                    to_key593=gPLSQLParser.to_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_to_key.add(to_key593.getTree());

                    pushFollow(FOLLOW_second_key_in_interval_expression8497);
                    second_key594=gPLSQLParser.second_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_second_key.add(second_key594.getTree());

                    // PLSQL_DMLParser.g:908:91: ( LEFT_PAREN cn2= concatenation_wrapper RIGHT_PAREN )?
                    int alt193=2;
                    alt193 = dfa193.predict(input);
                    switch (alt193) {
                        case 1 :
                            // PLSQL_DMLParser.g:908:92: LEFT_PAREN cn2= concatenation_wrapper RIGHT_PAREN
                            {
                            LEFT_PAREN595=(Token)match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_interval_expression8500); if (state.failed) return retval; 
                            if ( state.backtracking==0 ) stream_LEFT_PAREN.add(LEFT_PAREN595);


                            pushFollow(FOLLOW_concatenation_wrapper_in_interval_expression8504);
                            cn2=concatenation_wrapper();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) stream_concatenation_wrapper.add(cn2.getTree());

                            RIGHT_PAREN596=(Token)match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_interval_expression8506); if (state.failed) return retval; 
                            if ( state.backtracking==0 ) stream_RIGHT_PAREN.add(RIGHT_PAREN596);


                            }
                            break;

                    }


                    // AST REWRITE
                    // elements: cn1, cn2, day_key, second_key
                    // token labels: 
                    // rule labels: retval, cn2, cn1
                    // token list labels: 
                    // rule list labels: 
                    // wildcard labels: 
                    if ( state.backtracking==0 ) {

                    retval.tree = root_0;
                    RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);
                    RewriteRuleSubtreeStream stream_cn2=new RewriteRuleSubtreeStream(adaptor,"rule cn2",cn2!=null?cn2.tree:null);
                    RewriteRuleSubtreeStream stream_cn1=new RewriteRuleSubtreeStream(adaptor,"rule cn1",cn1!=null?cn1.tree:null);

                    root_0 = (Object)adaptor.nil();
                    // 909:9: -> ^( day_key second_key ( $cn1)? ( $cn2)? )
                    {
                        // PLSQL_DMLParser.g:909:12: ^( day_key second_key ( $cn1)? ( $cn2)? )
                        {
                        Object root_1 = (Object)adaptor.nil();
                        root_1 = (Object)adaptor.becomeRoot(stream_day_key.nextNode(), root_1);

                        adaptor.addChild(root_1, stream_second_key.nextTree());

                        // PLSQL_DMLParser.g:909:34: ( $cn1)?
                        if ( stream_cn1.hasNext() ) {
                            adaptor.addChild(root_1, stream_cn1.nextTree());

                        }
                        stream_cn1.reset();

                        // PLSQL_DMLParser.g:909:40: ( $cn2)?
                        if ( stream_cn2.hasNext() ) {
                            adaptor.addChild(root_1, stream_cn2.nextTree());

                        }
                        stream_cn2.reset();

                        adaptor.addChild(root_0, root_1);
                        }

                    }


                    retval.tree = root_0;
                    }

                    }
                    break;
                case 2 :
                    // PLSQL_DMLParser.g:910:10: year_key ( LEFT_PAREN concatenation_wrapper RIGHT_PAREN )? to_key month_key
                    {
                    pushFollow(FOLLOW_year_key_in_interval_expression8543);
                    year_key597=gPLSQLParser.year_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_year_key.add(year_key597.getTree());

                    // PLSQL_DMLParser.g:910:19: ( LEFT_PAREN concatenation_wrapper RIGHT_PAREN )?
                    int alt194=2;
                    int LA194_0 = input.LA(1);

                    if ( (LA194_0==LEFT_PAREN) ) {
                        alt194=1;
                    }
                    switch (alt194) {
                        case 1 :
                            // PLSQL_DMLParser.g:910:20: LEFT_PAREN concatenation_wrapper RIGHT_PAREN
                            {
                            LEFT_PAREN598=(Token)match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_interval_expression8546); if (state.failed) return retval; 
                            if ( state.backtracking==0 ) stream_LEFT_PAREN.add(LEFT_PAREN598);


                            pushFollow(FOLLOW_concatenation_wrapper_in_interval_expression8548);
                            concatenation_wrapper599=concatenation_wrapper();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) stream_concatenation_wrapper.add(concatenation_wrapper599.getTree());

                            RIGHT_PAREN600=(Token)match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_interval_expression8550); if (state.failed) return retval; 
                            if ( state.backtracking==0 ) stream_RIGHT_PAREN.add(RIGHT_PAREN600);


                            }
                            break;

                    }


                    pushFollow(FOLLOW_to_key_in_interval_expression8554);
                    to_key601=gPLSQLParser.to_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_to_key.add(to_key601.getTree());

                    pushFollow(FOLLOW_month_key_in_interval_expression8556);
                    month_key602=gPLSQLParser.month_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_month_key.add(month_key602.getTree());

                    // AST REWRITE
                    // elements: concatenation_wrapper, month_key, year_key
                    // token labels: 
                    // rule labels: retval
                    // token list labels: 
                    // rule list labels: 
                    // wildcard labels: 
                    if ( state.backtracking==0 ) {

                    retval.tree = root_0;
                    RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

                    root_0 = (Object)adaptor.nil();
                    // 911:9: -> ^( year_key month_key concatenation_wrapper )
                    {
                        // PLSQL_DMLParser.g:911:12: ^( year_key month_key concatenation_wrapper )
                        {
                        Object root_1 = (Object)adaptor.nil();
                        root_1 = (Object)adaptor.becomeRoot(stream_year_key.nextNode(), root_1);

                        adaptor.addChild(root_1, stream_month_key.nextTree());

                        adaptor.addChild(root_1, stream_concatenation_wrapper.nextTree());

                        adaptor.addChild(root_0, root_1);
                        }

                    }


                    retval.tree = root_0;
                    }

                    }
                    break;

            }
            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "interval_expression"


    public static class model_expression_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "model_expression"
    // PLSQL_DMLParser.g:914:1: model_expression : ( keep_expression -> keep_expression ) ( LEFT_BRACKET model_expression_element RIGHT_BRACKET -> ^( MODEL_EXPRESSION[$LEFT_BRACKET] $model_expression model_expression_element ) )? ;
    public final PLSQLParser_PLSQL_DMLParser.model_expression_return model_expression() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.model_expression_return retval = new PLSQLParser_PLSQL_DMLParser.model_expression_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token LEFT_BRACKET604=null;
        Token RIGHT_BRACKET606=null;
        PLSQLParser_PLSQL_DMLParser.keep_expression_return keep_expression603 =null;

        PLSQLParser_PLSQL_DMLParser.model_expression_element_return model_expression_element605 =null;


        Object LEFT_BRACKET604_tree=null;
        Object RIGHT_BRACKET606_tree=null;
        RewriteRuleTokenStream stream_LEFT_BRACKET=new RewriteRuleTokenStream(adaptor,"token LEFT_BRACKET");
        RewriteRuleTokenStream stream_RIGHT_BRACKET=new RewriteRuleTokenStream(adaptor,"token RIGHT_BRACKET");
        RewriteRuleSubtreeStream stream_model_expression_element=new RewriteRuleSubtreeStream(adaptor,"rule model_expression_element");
        RewriteRuleSubtreeStream stream_keep_expression=new RewriteRuleSubtreeStream(adaptor,"rule keep_expression");
        try {
            // PLSQL_DMLParser.g:915:5: ( ( keep_expression -> keep_expression ) ( LEFT_BRACKET model_expression_element RIGHT_BRACKET -> ^( MODEL_EXPRESSION[$LEFT_BRACKET] $model_expression model_expression_element ) )? )
            // PLSQL_DMLParser.g:915:10: ( keep_expression -> keep_expression ) ( LEFT_BRACKET model_expression_element RIGHT_BRACKET -> ^( MODEL_EXPRESSION[$LEFT_BRACKET] $model_expression model_expression_element ) )?
            {
            // PLSQL_DMLParser.g:915:10: ( keep_expression -> keep_expression )
            // PLSQL_DMLParser.g:915:11: keep_expression
            {
            pushFollow(FOLLOW_keep_expression_in_model_expression8595);
            keep_expression603=keep_expression();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_keep_expression.add(keep_expression603.getTree());

            // AST REWRITE
            // elements: keep_expression
            // token labels: 
            // rule labels: retval
            // token list labels: 
            // rule list labels: 
            // wildcard labels: 
            if ( state.backtracking==0 ) {

            retval.tree = root_0;
            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

            root_0 = (Object)adaptor.nil();
            // 915:27: -> keep_expression
            {
                adaptor.addChild(root_0, stream_keep_expression.nextTree());

            }


            retval.tree = root_0;
            }

            }


            // PLSQL_DMLParser.g:916:9: ( LEFT_BRACKET model_expression_element RIGHT_BRACKET -> ^( MODEL_EXPRESSION[$LEFT_BRACKET] $model_expression model_expression_element ) )?
            int alt196=2;
            int LA196_0 = input.LA(1);

            if ( (LA196_0==LEFT_BRACKET) ) {
                alt196=1;
            }
            switch (alt196) {
                case 1 :
                    // PLSQL_DMLParser.g:916:10: LEFT_BRACKET model_expression_element RIGHT_BRACKET
                    {
                    LEFT_BRACKET604=(Token)match(input,LEFT_BRACKET,FOLLOW_LEFT_BRACKET_in_model_expression8612); if (state.failed) return retval; 
                    if ( state.backtracking==0 ) stream_LEFT_BRACKET.add(LEFT_BRACKET604);


                    pushFollow(FOLLOW_model_expression_element_in_model_expression8614);
                    model_expression_element605=model_expression_element();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_model_expression_element.add(model_expression_element605.getTree());

                    RIGHT_BRACKET606=(Token)match(input,RIGHT_BRACKET,FOLLOW_RIGHT_BRACKET_in_model_expression8616); if (state.failed) return retval; 
                    if ( state.backtracking==0 ) stream_RIGHT_BRACKET.add(RIGHT_BRACKET606);


                    // AST REWRITE
                    // elements: model_expression, model_expression_element
                    // token labels: 
                    // rule labels: retval
                    // token list labels: 
                    // rule list labels: 
                    // wildcard labels: 
                    if ( state.backtracking==0 ) {

                    retval.tree = root_0;
                    RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

                    root_0 = (Object)adaptor.nil();
                    // 917:13: -> ^( MODEL_EXPRESSION[$LEFT_BRACKET] $model_expression model_expression_element )
                    {
                        // PLSQL_DMLParser.g:917:16: ^( MODEL_EXPRESSION[$LEFT_BRACKET] $model_expression model_expression_element )
                        {
                        Object root_1 = (Object)adaptor.nil();
                        root_1 = (Object)adaptor.becomeRoot(
                        (Object)adaptor.create(MODEL_EXPRESSION, LEFT_BRACKET604)
                        , root_1);

                        adaptor.addChild(root_1, stream_retval.nextTree());

                        adaptor.addChild(root_1, stream_model_expression_element.nextTree());

                        adaptor.addChild(root_0, root_1);
                        }

                    }


                    retval.tree = root_0;
                    }

                    }
                    break;

            }


            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "model_expression"


    public static class model_expression_element_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "model_expression_element"
    // PLSQL_DMLParser.g:920:1: model_expression_element : ( ( ( any_key )=> any_key | condition_wrapper ) ( COMMA ! ( ( any_key )=> any_key | condition_wrapper ) )* | single_column_for_loop ( COMMA ! single_column_for_loop )* | multi_column_for_loop );
    public final PLSQLParser_PLSQL_DMLParser.model_expression_element_return model_expression_element() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.model_expression_element_return retval = new PLSQLParser_PLSQL_DMLParser.model_expression_element_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token COMMA609=null;
        Token COMMA613=null;
        PLSQLParser_PLSQLKeys.any_key_return any_key607 =null;

        PLSQLParser_PLSQL_DMLParser.condition_wrapper_return condition_wrapper608 =null;

        PLSQLParser_PLSQLKeys.any_key_return any_key610 =null;

        PLSQLParser_PLSQL_DMLParser.condition_wrapper_return condition_wrapper611 =null;

        PLSQLParser_PLSQL_DMLParser.single_column_for_loop_return single_column_for_loop612 =null;

        PLSQLParser_PLSQL_DMLParser.single_column_for_loop_return single_column_for_loop614 =null;

        PLSQLParser_PLSQL_DMLParser.multi_column_for_loop_return multi_column_for_loop615 =null;


        Object COMMA609_tree=null;
        Object COMMA613_tree=null;

        try {
            // PLSQL_DMLParser.g:921:5: ( ( ( any_key )=> any_key | condition_wrapper ) ( COMMA ! ( ( any_key )=> any_key | condition_wrapper ) )* | single_column_for_loop ( COMMA ! single_column_for_loop )* | multi_column_for_loop )
            int alt201=3;
            int LA201_0 = input.LA(1);

            if ( (LA201_0==APPROXIMATE_NUM_LIT||(LA201_0 >= CHAR_STRING && LA201_0 <= COLON)||LA201_0==DELIMITED_ID||LA201_0==EXACT_NUM_LIT||LA201_0==INTRODUCER||LA201_0==LEFT_PAREN||LA201_0==MINUS_SIGN||LA201_0==PLUS_SIGN||LA201_0==REGULAR_ID||LA201_0==SQL92_RESERVED_ALL||LA201_0==SQL92_RESERVED_ANY||LA201_0==SQL92_RESERVED_CASE||LA201_0==SQL92_RESERVED_DEFAULT||LA201_0==SQL92_RESERVED_DISTINCT||(LA201_0 >= SQL92_RESERVED_EXISTS && LA201_0 <= SQL92_RESERVED_FALSE)||(LA201_0 >= SQL92_RESERVED_NOT && LA201_0 <= SQL92_RESERVED_NULL)||LA201_0==SQL92_RESERVED_PRIOR||LA201_0==SQL92_RESERVED_TRUE||LA201_0==UNSIGNED_INTEGER) ) {
                alt201=1;
            }
            else if ( (LA201_0==SQL92_RESERVED_FOR) ) {
                int LA201_2 = input.LA(2);

                if ( (LA201_2==DELIMITED_ID||LA201_2==INTRODUCER||LA201_2==REGULAR_ID) ) {
                    alt201=2;
                }
                else if ( (LA201_2==LEFT_PAREN) ) {
                    alt201=3;
                }
                else {
                    if (state.backtracking>0) {state.failed=true; return retval;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 201, 2, input);

                    throw nvae;

                }
            }
            else {
                if (state.backtracking>0) {state.failed=true; return retval;}
                NoViableAltException nvae =
                    new NoViableAltException("", 201, 0, input);

                throw nvae;

            }
            switch (alt201) {
                case 1 :
                    // PLSQL_DMLParser.g:921:10: ( ( any_key )=> any_key | condition_wrapper ) ( COMMA ! ( ( any_key )=> any_key | condition_wrapper ) )*
                    {
                    root_0 = (Object)adaptor.nil();


                    // PLSQL_DMLParser.g:921:10: ( ( any_key )=> any_key | condition_wrapper )
                    int alt197=2;
                    int LA197_0 = input.LA(1);

                    if ( (LA197_0==SQL92_RESERVED_ANY) ) {
                        int LA197_1 = input.LA(2);

                        if ( (LA197_1==COMMA) && (synpred17_PLSQL_DMLParser())) {
                            alt197=1;
                        }
                        else if ( (LA197_1==RIGHT_BRACKET) && (synpred17_PLSQL_DMLParser())) {
                            alt197=1;
                        }
                        else if ( (LA197_1==LEFT_PAREN) ) {
                            alt197=2;
                        }
                        else {
                            if (state.backtracking>0) {state.failed=true; return retval;}
                            NoViableAltException nvae =
                                new NoViableAltException("", 197, 1, input);

                            throw nvae;

                        }
                    }
                    else if ( (LA197_0==APPROXIMATE_NUM_LIT||(LA197_0 >= CHAR_STRING && LA197_0 <= COLON)||LA197_0==DELIMITED_ID||LA197_0==EXACT_NUM_LIT||LA197_0==INTRODUCER||LA197_0==LEFT_PAREN||LA197_0==MINUS_SIGN||LA197_0==PLUS_SIGN||LA197_0==REGULAR_ID||LA197_0==SQL92_RESERVED_ALL||LA197_0==SQL92_RESERVED_CASE||LA197_0==SQL92_RESERVED_DEFAULT||LA197_0==SQL92_RESERVED_DISTINCT||(LA197_0 >= SQL92_RESERVED_EXISTS && LA197_0 <= SQL92_RESERVED_FALSE)||(LA197_0 >= SQL92_RESERVED_NOT && LA197_0 <= SQL92_RESERVED_NULL)||LA197_0==SQL92_RESERVED_PRIOR||LA197_0==SQL92_RESERVED_TRUE||LA197_0==UNSIGNED_INTEGER) ) {
                        alt197=2;
                    }
                    else {
                        if (state.backtracking>0) {state.failed=true; return retval;}
                        NoViableAltException nvae =
                            new NoViableAltException("", 197, 0, input);

                        throw nvae;

                    }
                    switch (alt197) {
                        case 1 :
                            // PLSQL_DMLParser.g:921:11: ( any_key )=> any_key
                            {
                            pushFollow(FOLLOW_any_key_in_model_expression_element8668);
                            any_key607=gPLSQLParser.any_key();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) adaptor.addChild(root_0, any_key607.getTree());

                            }
                            break;
                        case 2 :
                            // PLSQL_DMLParser.g:921:31: condition_wrapper
                            {
                            pushFollow(FOLLOW_condition_wrapper_in_model_expression_element8670);
                            condition_wrapper608=condition_wrapper();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) adaptor.addChild(root_0, condition_wrapper608.getTree());

                            }
                            break;

                    }


                    // PLSQL_DMLParser.g:921:50: ( COMMA ! ( ( any_key )=> any_key | condition_wrapper ) )*
                    loop199:
                    do {
                        int alt199=2;
                        int LA199_0 = input.LA(1);

                        if ( (LA199_0==COMMA) ) {
                            alt199=1;
                        }


                        switch (alt199) {
                    	case 1 :
                    	    // PLSQL_DMLParser.g:921:51: COMMA ! ( ( any_key )=> any_key | condition_wrapper )
                    	    {
                    	    COMMA609=(Token)match(input,COMMA,FOLLOW_COMMA_in_model_expression_element8674); if (state.failed) return retval;

                    	    // PLSQL_DMLParser.g:921:58: ( ( any_key )=> any_key | condition_wrapper )
                    	    int alt198=2;
                    	    int LA198_0 = input.LA(1);

                    	    if ( (LA198_0==SQL92_RESERVED_ANY) ) {
                    	        int LA198_1 = input.LA(2);

                    	        if ( (LA198_1==RIGHT_BRACKET) && (synpred18_PLSQL_DMLParser())) {
                    	            alt198=1;
                    	        }
                    	        else if ( (LA198_1==COMMA) && (synpred18_PLSQL_DMLParser())) {
                    	            alt198=1;
                    	        }
                    	        else if ( (LA198_1==LEFT_PAREN) ) {
                    	            alt198=2;
                    	        }
                    	        else {
                    	            if (state.backtracking>0) {state.failed=true; return retval;}
                    	            NoViableAltException nvae =
                    	                new NoViableAltException("", 198, 1, input);

                    	            throw nvae;

                    	        }
                    	    }
                    	    else if ( (LA198_0==APPROXIMATE_NUM_LIT||(LA198_0 >= CHAR_STRING && LA198_0 <= COLON)||LA198_0==DELIMITED_ID||LA198_0==EXACT_NUM_LIT||LA198_0==INTRODUCER||LA198_0==LEFT_PAREN||LA198_0==MINUS_SIGN||LA198_0==PLUS_SIGN||LA198_0==REGULAR_ID||LA198_0==SQL92_RESERVED_ALL||LA198_0==SQL92_RESERVED_CASE||LA198_0==SQL92_RESERVED_DEFAULT||LA198_0==SQL92_RESERVED_DISTINCT||(LA198_0 >= SQL92_RESERVED_EXISTS && LA198_0 <= SQL92_RESERVED_FALSE)||(LA198_0 >= SQL92_RESERVED_NOT && LA198_0 <= SQL92_RESERVED_NULL)||LA198_0==SQL92_RESERVED_PRIOR||LA198_0==SQL92_RESERVED_TRUE||LA198_0==UNSIGNED_INTEGER) ) {
                    	        alt198=2;
                    	    }
                    	    else {
                    	        if (state.backtracking>0) {state.failed=true; return retval;}
                    	        NoViableAltException nvae =
                    	            new NoViableAltException("", 198, 0, input);

                    	        throw nvae;

                    	    }
                    	    switch (alt198) {
                    	        case 1 :
                    	            // PLSQL_DMLParser.g:921:59: ( any_key )=> any_key
                    	            {
                    	            pushFollow(FOLLOW_any_key_in_model_expression_element8683);
                    	            any_key610=gPLSQLParser.any_key();

                    	            state._fsp--;
                    	            if (state.failed) return retval;
                    	            if ( state.backtracking==0 ) adaptor.addChild(root_0, any_key610.getTree());

                    	            }
                    	            break;
                    	        case 2 :
                    	            // PLSQL_DMLParser.g:921:79: condition_wrapper
                    	            {
                    	            pushFollow(FOLLOW_condition_wrapper_in_model_expression_element8685);
                    	            condition_wrapper611=condition_wrapper();

                    	            state._fsp--;
                    	            if (state.failed) return retval;
                    	            if ( state.backtracking==0 ) adaptor.addChild(root_0, condition_wrapper611.getTree());

                    	            }
                    	            break;

                    	    }


                    	    }
                    	    break;

                    	default :
                    	    break loop199;
                        }
                    } while (true);


                    }
                    break;
                case 2 :
                    // PLSQL_DMLParser.g:922:10: single_column_for_loop ( COMMA ! single_column_for_loop )*
                    {
                    root_0 = (Object)adaptor.nil();


                    pushFollow(FOLLOW_single_column_for_loop_in_model_expression_element8699);
                    single_column_for_loop612=single_column_for_loop();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, single_column_for_loop612.getTree());

                    // PLSQL_DMLParser.g:922:33: ( COMMA ! single_column_for_loop )*
                    loop200:
                    do {
                        int alt200=2;
                        int LA200_0 = input.LA(1);

                        if ( (LA200_0==COMMA) ) {
                            alt200=1;
                        }


                        switch (alt200) {
                    	case 1 :
                    	    // PLSQL_DMLParser.g:922:34: COMMA ! single_column_for_loop
                    	    {
                    	    COMMA613=(Token)match(input,COMMA,FOLLOW_COMMA_in_model_expression_element8702); if (state.failed) return retval;

                    	    pushFollow(FOLLOW_single_column_for_loop_in_model_expression_element8705);
                    	    single_column_for_loop614=single_column_for_loop();

                    	    state._fsp--;
                    	    if (state.failed) return retval;
                    	    if ( state.backtracking==0 ) adaptor.addChild(root_0, single_column_for_loop614.getTree());

                    	    }
                    	    break;

                    	default :
                    	    break loop200;
                        }
                    } while (true);


                    }
                    break;
                case 3 :
                    // PLSQL_DMLParser.g:923:10: multi_column_for_loop
                    {
                    root_0 = (Object)adaptor.nil();


                    pushFollow(FOLLOW_multi_column_for_loop_in_model_expression_element8718);
                    multi_column_for_loop615=multi_column_for_loop();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, multi_column_for_loop615.getTree());

                    }
                    break;

            }
            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "model_expression_element"


    public static class single_column_for_loop_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "single_column_for_loop"
    // PLSQL_DMLParser.g:926:1: single_column_for_loop : for_key column_name ( in_key expression_list | ( for_like_part )? from_key ex1= expression to_key ex2= expression for_increment_decrement_type ex3= expression ) -> {mode == 1}? ^( FOR_SINGLE_COLUMN[$for_key.start] column_name ^( in_key expression_list ) ) -> ^( FOR_SINGLE_COLUMN[$for_key.start] column_name ^( from_key ^( EXPR $ex1) ) ^( to_key ^( EXPR $ex2) ) ^( for_increment_decrement_type ^( EXPR $ex3) ) ( for_like_part )? ) ;
    public final PLSQLParser_PLSQL_DMLParser.single_column_for_loop_return single_column_for_loop() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.single_column_for_loop_return retval = new PLSQLParser_PLSQL_DMLParser.single_column_for_loop_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        PLSQLParser_PLSQL_DMLParser.expression_return ex1 =null;

        PLSQLParser_PLSQL_DMLParser.expression_return ex2 =null;

        PLSQLParser_PLSQL_DMLParser.expression_return ex3 =null;

        PLSQLParser_PLSQLKeys.for_key_return for_key616 =null;

        PLSQLParser_PLSQLCommons.column_name_return column_name617 =null;

        PLSQLParser_PLSQLKeys.in_key_return in_key618 =null;

        PLSQLParser_PLSQL_DMLParser.expression_list_return expression_list619 =null;

        PLSQLParser_PLSQL_DMLParser.for_like_part_return for_like_part620 =null;

        PLSQLParser_PLSQLKeys.from_key_return from_key621 =null;

        PLSQLParser_PLSQLKeys.to_key_return to_key622 =null;

        PLSQLParser_PLSQL_DMLParser.for_increment_decrement_type_return for_increment_decrement_type623 =null;


        RewriteRuleSubtreeStream stream_expression=new RewriteRuleSubtreeStream(adaptor,"rule expression");
        RewriteRuleSubtreeStream stream_expression_list=new RewriteRuleSubtreeStream(adaptor,"rule expression_list");
        RewriteRuleSubtreeStream stream_for_like_part=new RewriteRuleSubtreeStream(adaptor,"rule for_like_part");
        RewriteRuleSubtreeStream stream_to_key=new RewriteRuleSubtreeStream(adaptor,"rule to_key");
        RewriteRuleSubtreeStream stream_column_name=new RewriteRuleSubtreeStream(adaptor,"rule column_name");
        RewriteRuleSubtreeStream stream_for_increment_decrement_type=new RewriteRuleSubtreeStream(adaptor,"rule for_increment_decrement_type");
        RewriteRuleSubtreeStream stream_in_key=new RewriteRuleSubtreeStream(adaptor,"rule in_key");
        RewriteRuleSubtreeStream stream_for_key=new RewriteRuleSubtreeStream(adaptor,"rule for_key");
        RewriteRuleSubtreeStream stream_from_key=new RewriteRuleSubtreeStream(adaptor,"rule from_key");
            int mode = 0;    
        try {
            // PLSQL_DMLParser.g:928:5: ( for_key column_name ( in_key expression_list | ( for_like_part )? from_key ex1= expression to_key ex2= expression for_increment_decrement_type ex3= expression ) -> {mode == 1}? ^( FOR_SINGLE_COLUMN[$for_key.start] column_name ^( in_key expression_list ) ) -> ^( FOR_SINGLE_COLUMN[$for_key.start] column_name ^( from_key ^( EXPR $ex1) ) ^( to_key ^( EXPR $ex2) ) ^( for_increment_decrement_type ^( EXPR $ex3) ) ( for_like_part )? ) )
            // PLSQL_DMLParser.g:928:10: for_key column_name ( in_key expression_list | ( for_like_part )? from_key ex1= expression to_key ex2= expression for_increment_decrement_type ex3= expression )
            {
            pushFollow(FOLLOW_for_key_in_single_column_for_loop8746);
            for_key616=gPLSQLParser.for_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_for_key.add(for_key616.getTree());

            pushFollow(FOLLOW_column_name_in_single_column_for_loop8748);
            column_name617=gPLSQLParser.column_name();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_column_name.add(column_name617.getTree());

            // PLSQL_DMLParser.g:929:5: ( in_key expression_list | ( for_like_part )? from_key ex1= expression to_key ex2= expression for_increment_decrement_type ex3= expression )
            int alt203=2;
            int LA203_0 = input.LA(1);

            if ( (LA203_0==SQL92_RESERVED_IN) ) {
                alt203=1;
            }
            else if ( (LA203_0==SQL92_RESERVED_FROM||LA203_0==SQL92_RESERVED_LIKE) ) {
                alt203=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return retval;}
                NoViableAltException nvae =
                    new NoViableAltException("", 203, 0, input);

                throw nvae;

            }
            switch (alt203) {
                case 1 :
                    // PLSQL_DMLParser.g:929:10: in_key expression_list
                    {
                    pushFollow(FOLLOW_in_key_in_single_column_for_loop8760);
                    in_key618=gPLSQLParser.in_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_in_key.add(in_key618.getTree());

                    pushFollow(FOLLOW_expression_list_in_single_column_for_loop8762);
                    expression_list619=expression_list();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_expression_list.add(expression_list619.getTree());

                    if ( state.backtracking==0 ) {mode = 1;}

                    }
                    break;
                case 2 :
                    // PLSQL_DMLParser.g:930:10: ( for_like_part )? from_key ex1= expression to_key ex2= expression for_increment_decrement_type ex3= expression
                    {
                    // PLSQL_DMLParser.g:930:10: ( for_like_part )?
                    int alt202=2;
                    int LA202_0 = input.LA(1);

                    if ( (LA202_0==SQL92_RESERVED_LIKE) ) {
                        alt202=1;
                    }
                    switch (alt202) {
                        case 1 :
                            // PLSQL_DMLParser.g:930:10: for_like_part
                            {
                            pushFollow(FOLLOW_for_like_part_in_single_column_for_loop8775);
                            for_like_part620=for_like_part();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) stream_for_like_part.add(for_like_part620.getTree());

                            }
                            break;

                    }


                    pushFollow(FOLLOW_from_key_in_single_column_for_loop8778);
                    from_key621=gPLSQLParser.from_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_from_key.add(from_key621.getTree());

                    pushFollow(FOLLOW_expression_in_single_column_for_loop8782);
                    ex1=expression();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_expression.add(ex1.getTree());

                    pushFollow(FOLLOW_to_key_in_single_column_for_loop8796);
                    to_key622=gPLSQLParser.to_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_to_key.add(to_key622.getTree());

                    pushFollow(FOLLOW_expression_in_single_column_for_loop8800);
                    ex2=expression();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_expression.add(ex2.getTree());

                    pushFollow(FOLLOW_for_increment_decrement_type_in_single_column_for_loop8802);
                    for_increment_decrement_type623=for_increment_decrement_type();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_for_increment_decrement_type.add(for_increment_decrement_type623.getTree());

                    pushFollow(FOLLOW_expression_in_single_column_for_loop8806);
                    ex3=expression();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_expression.add(ex3.getTree());

                    }
                    break;

            }


            // AST REWRITE
            // elements: ex2, for_like_part, for_increment_decrement_type, expression_list, column_name, column_name, to_key, in_key, ex1, ex3, from_key
            // token labels: 
            // rule labels: retval, ex3, ex2, ex1
            // token list labels: 
            // rule list labels: 
            // wildcard labels: 
            if ( state.backtracking==0 ) {

            retval.tree = root_0;
            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);
            RewriteRuleSubtreeStream stream_ex3=new RewriteRuleSubtreeStream(adaptor,"rule ex3",ex3!=null?ex3.tree:null);
            RewriteRuleSubtreeStream stream_ex2=new RewriteRuleSubtreeStream(adaptor,"rule ex2",ex2!=null?ex2.tree:null);
            RewriteRuleSubtreeStream stream_ex1=new RewriteRuleSubtreeStream(adaptor,"rule ex1",ex1!=null?ex1.tree:null);

            root_0 = (Object)adaptor.nil();
            // 933:9: -> {mode == 1}? ^( FOR_SINGLE_COLUMN[$for_key.start] column_name ^( in_key expression_list ) )
            if (mode == 1) {
                // PLSQL_DMLParser.g:933:24: ^( FOR_SINGLE_COLUMN[$for_key.start] column_name ^( in_key expression_list ) )
                {
                Object root_1 = (Object)adaptor.nil();
                root_1 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(FOR_SINGLE_COLUMN, (for_key616!=null?((Token)for_key616.start):null))
                , root_1);

                adaptor.addChild(root_1, stream_column_name.nextTree());

                // PLSQL_DMLParser.g:933:72: ^( in_key expression_list )
                {
                Object root_2 = (Object)adaptor.nil();
                root_2 = (Object)adaptor.becomeRoot(stream_in_key.nextNode(), root_2);

                adaptor.addChild(root_2, stream_expression_list.nextTree());

                adaptor.addChild(root_1, root_2);
                }

                adaptor.addChild(root_0, root_1);
                }

            }

            else // 934:9: -> ^( FOR_SINGLE_COLUMN[$for_key.start] column_name ^( from_key ^( EXPR $ex1) ) ^( to_key ^( EXPR $ex2) ) ^( for_increment_decrement_type ^( EXPR $ex3) ) ( for_like_part )? )
            {
                // PLSQL_DMLParser.g:934:12: ^( FOR_SINGLE_COLUMN[$for_key.start] column_name ^( from_key ^( EXPR $ex1) ) ^( to_key ^( EXPR $ex2) ) ^( for_increment_decrement_type ^( EXPR $ex3) ) ( for_like_part )? )
                {
                Object root_1 = (Object)adaptor.nil();
                root_1 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(FOR_SINGLE_COLUMN, (for_key616!=null?((Token)for_key616.start):null))
                , root_1);

                adaptor.addChild(root_1, stream_column_name.nextTree());

                // PLSQL_DMLParser.g:934:60: ^( from_key ^( EXPR $ex1) )
                {
                Object root_2 = (Object)adaptor.nil();
                root_2 = (Object)adaptor.becomeRoot(stream_from_key.nextNode(), root_2);

                // PLSQL_DMLParser.g:934:71: ^( EXPR $ex1)
                {
                Object root_3 = (Object)adaptor.nil();
                root_3 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(EXPR, "EXPR")
                , root_3);

                adaptor.addChild(root_3, stream_ex1.nextTree());

                adaptor.addChild(root_2, root_3);
                }

                adaptor.addChild(root_1, root_2);
                }

                // PLSQL_DMLParser.g:934:85: ^( to_key ^( EXPR $ex2) )
                {
                Object root_2 = (Object)adaptor.nil();
                root_2 = (Object)adaptor.becomeRoot(stream_to_key.nextNode(), root_2);

                // PLSQL_DMLParser.g:934:94: ^( EXPR $ex2)
                {
                Object root_3 = (Object)adaptor.nil();
                root_3 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(EXPR, "EXPR")
                , root_3);

                adaptor.addChild(root_3, stream_ex2.nextTree());

                adaptor.addChild(root_2, root_3);
                }

                adaptor.addChild(root_1, root_2);
                }

                // PLSQL_DMLParser.g:934:108: ^( for_increment_decrement_type ^( EXPR $ex3) )
                {
                Object root_2 = (Object)adaptor.nil();
                root_2 = (Object)adaptor.becomeRoot(stream_for_increment_decrement_type.nextNode(), root_2);

                // PLSQL_DMLParser.g:934:139: ^( EXPR $ex3)
                {
                Object root_3 = (Object)adaptor.nil();
                root_3 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(EXPR, "EXPR")
                , root_3);

                adaptor.addChild(root_3, stream_ex3.nextTree());

                adaptor.addChild(root_2, root_3);
                }

                adaptor.addChild(root_1, root_2);
                }

                // PLSQL_DMLParser.g:934:153: ( for_like_part )?
                if ( stream_for_like_part.hasNext() ) {
                    adaptor.addChild(root_1, stream_for_like_part.nextTree());

                }
                stream_for_like_part.reset();

                adaptor.addChild(root_0, root_1);
                }

            }


            retval.tree = root_0;
            }

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "single_column_for_loop"


    public static class for_like_part_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "for_like_part"
    // PLSQL_DMLParser.g:937:1: for_like_part : like_key expression -> ^( like_key ^( EXPR expression ) ) ;
    public final PLSQLParser_PLSQL_DMLParser.for_like_part_return for_like_part() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.for_like_part_return retval = new PLSQLParser_PLSQL_DMLParser.for_like_part_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        PLSQLParser_PLSQLKeys.like_key_return like_key624 =null;

        PLSQLParser_PLSQL_DMLParser.expression_return expression625 =null;


        RewriteRuleSubtreeStream stream_expression=new RewriteRuleSubtreeStream(adaptor,"rule expression");
        RewriteRuleSubtreeStream stream_like_key=new RewriteRuleSubtreeStream(adaptor,"rule like_key");
        try {
            // PLSQL_DMLParser.g:938:5: ( like_key expression -> ^( like_key ^( EXPR expression ) ) )
            // PLSQL_DMLParser.g:938:10: like_key expression
            {
            pushFollow(FOLLOW_like_key_in_for_like_part8915);
            like_key624=gPLSQLParser.like_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_like_key.add(like_key624.getTree());

            pushFollow(FOLLOW_expression_in_for_like_part8917);
            expression625=expression();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_expression.add(expression625.getTree());

            // AST REWRITE
            // elements: like_key, expression
            // token labels: 
            // rule labels: retval
            // token list labels: 
            // rule list labels: 
            // wildcard labels: 
            if ( state.backtracking==0 ) {

            retval.tree = root_0;
            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

            root_0 = (Object)adaptor.nil();
            // 939:9: -> ^( like_key ^( EXPR expression ) )
            {
                // PLSQL_DMLParser.g:939:12: ^( like_key ^( EXPR expression ) )
                {
                Object root_1 = (Object)adaptor.nil();
                root_1 = (Object)adaptor.becomeRoot(stream_like_key.nextNode(), root_1);

                // PLSQL_DMLParser.g:939:23: ^( EXPR expression )
                {
                Object root_2 = (Object)adaptor.nil();
                root_2 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(EXPR, "EXPR")
                , root_2);

                adaptor.addChild(root_2, stream_expression.nextTree());

                adaptor.addChild(root_1, root_2);
                }

                adaptor.addChild(root_0, root_1);
                }

            }


            retval.tree = root_0;
            }

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "for_like_part"


    public static class for_increment_decrement_type_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "for_increment_decrement_type"
    // PLSQL_DMLParser.g:942:1: for_increment_decrement_type : ( increment_key | decrement_key );
    public final PLSQLParser_PLSQL_DMLParser.for_increment_decrement_type_return for_increment_decrement_type() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.for_increment_decrement_type_return retval = new PLSQLParser_PLSQL_DMLParser.for_increment_decrement_type_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        PLSQLParser_PLSQLKeys.increment_key_return increment_key626 =null;

        PLSQLParser_PLSQLKeys.decrement_key_return decrement_key627 =null;



        try {
            // PLSQL_DMLParser.g:943:5: ( increment_key | decrement_key )
            int alt204=2;
            int LA204_0 = input.LA(1);

            if ( (LA204_0==REGULAR_ID) && (((input.LT(1).getText().equalsIgnoreCase("decrement"))||(input.LT(1).getText().equalsIgnoreCase("increment"))))) {
                int LA204_1 = input.LA(2);

                if ( ((input.LT(1).getText().equalsIgnoreCase("increment"))) ) {
                    alt204=1;
                }
                else if ( ((input.LT(1).getText().equalsIgnoreCase("decrement"))) ) {
                    alt204=2;
                }
                else {
                    if (state.backtracking>0) {state.failed=true; return retval;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 204, 1, input);

                    throw nvae;

                }
            }
            else {
                if (state.backtracking>0) {state.failed=true; return retval;}
                NoViableAltException nvae =
                    new NoViableAltException("", 204, 0, input);

                throw nvae;

            }
            switch (alt204) {
                case 1 :
                    // PLSQL_DMLParser.g:943:10: increment_key
                    {
                    root_0 = (Object)adaptor.nil();


                    pushFollow(FOLLOW_increment_key_in_for_increment_decrement_type8957);
                    increment_key626=gPLSQLParser.increment_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, increment_key626.getTree());

                    }
                    break;
                case 2 :
                    // PLSQL_DMLParser.g:944:10: decrement_key
                    {
                    root_0 = (Object)adaptor.nil();


                    pushFollow(FOLLOW_decrement_key_in_for_increment_decrement_type8968);
                    decrement_key627=gPLSQLParser.decrement_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, decrement_key627.getTree());

                    }
                    break;

            }
            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "for_increment_decrement_type"


    public static class multi_column_for_loop_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "multi_column_for_loop"
    // PLSQL_DMLParser.g:947:1: multi_column_for_loop : for_key LEFT_PAREN column_name ( COMMA column_name )* RIGHT_PAREN in_key LEFT_PAREN ( ( select_key )=> subquery | ( LEFT_PAREN )=> LEFT_PAREN expression_list ( COMMA expression_list )* RIGHT_PAREN ) RIGHT_PAREN -> ^( FOR_MULTI_COLUMN[$for_key.start] ( column_name )+ ^( in_key ( subquery )? ( expression_list )* ) ) ;
    public final PLSQLParser_PLSQL_DMLParser.multi_column_for_loop_return multi_column_for_loop() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.multi_column_for_loop_return retval = new PLSQLParser_PLSQL_DMLParser.multi_column_for_loop_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token LEFT_PAREN629=null;
        Token COMMA631=null;
        Token RIGHT_PAREN633=null;
        Token LEFT_PAREN635=null;
        Token LEFT_PAREN637=null;
        Token COMMA639=null;
        Token RIGHT_PAREN641=null;
        Token RIGHT_PAREN642=null;
        PLSQLParser_PLSQLKeys.for_key_return for_key628 =null;

        PLSQLParser_PLSQLCommons.column_name_return column_name630 =null;

        PLSQLParser_PLSQLCommons.column_name_return column_name632 =null;

        PLSQLParser_PLSQLKeys.in_key_return in_key634 =null;

        PLSQLParser_PLSQL_DMLParser.subquery_return subquery636 =null;

        PLSQLParser_PLSQL_DMLParser.expression_list_return expression_list638 =null;

        PLSQLParser_PLSQL_DMLParser.expression_list_return expression_list640 =null;


        Object LEFT_PAREN629_tree=null;
        Object COMMA631_tree=null;
        Object RIGHT_PAREN633_tree=null;
        Object LEFT_PAREN635_tree=null;
        Object LEFT_PAREN637_tree=null;
        Object COMMA639_tree=null;
        Object RIGHT_PAREN641_tree=null;
        Object RIGHT_PAREN642_tree=null;
        RewriteRuleTokenStream stream_LEFT_PAREN=new RewriteRuleTokenStream(adaptor,"token LEFT_PAREN");
        RewriteRuleTokenStream stream_RIGHT_PAREN=new RewriteRuleTokenStream(adaptor,"token RIGHT_PAREN");
        RewriteRuleTokenStream stream_COMMA=new RewriteRuleTokenStream(adaptor,"token COMMA");
        RewriteRuleSubtreeStream stream_expression_list=new RewriteRuleSubtreeStream(adaptor,"rule expression_list");
        RewriteRuleSubtreeStream stream_column_name=new RewriteRuleSubtreeStream(adaptor,"rule column_name");
        RewriteRuleSubtreeStream stream_in_key=new RewriteRuleSubtreeStream(adaptor,"rule in_key");
        RewriteRuleSubtreeStream stream_for_key=new RewriteRuleSubtreeStream(adaptor,"rule for_key");
        RewriteRuleSubtreeStream stream_subquery=new RewriteRuleSubtreeStream(adaptor,"rule subquery");
        try {
            // PLSQL_DMLParser.g:948:5: ( for_key LEFT_PAREN column_name ( COMMA column_name )* RIGHT_PAREN in_key LEFT_PAREN ( ( select_key )=> subquery | ( LEFT_PAREN )=> LEFT_PAREN expression_list ( COMMA expression_list )* RIGHT_PAREN ) RIGHT_PAREN -> ^( FOR_MULTI_COLUMN[$for_key.start] ( column_name )+ ^( in_key ( subquery )? ( expression_list )* ) ) )
            // PLSQL_DMLParser.g:948:10: for_key LEFT_PAREN column_name ( COMMA column_name )* RIGHT_PAREN in_key LEFT_PAREN ( ( select_key )=> subquery | ( LEFT_PAREN )=> LEFT_PAREN expression_list ( COMMA expression_list )* RIGHT_PAREN ) RIGHT_PAREN
            {
            pushFollow(FOLLOW_for_key_in_multi_column_for_loop8988);
            for_key628=gPLSQLParser.for_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_for_key.add(for_key628.getTree());

            LEFT_PAREN629=(Token)match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_multi_column_for_loop8990); if (state.failed) return retval; 
            if ( state.backtracking==0 ) stream_LEFT_PAREN.add(LEFT_PAREN629);


            pushFollow(FOLLOW_column_name_in_multi_column_for_loop8992);
            column_name630=gPLSQLParser.column_name();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_column_name.add(column_name630.getTree());

            // PLSQL_DMLParser.g:948:41: ( COMMA column_name )*
            loop205:
            do {
                int alt205=2;
                int LA205_0 = input.LA(1);

                if ( (LA205_0==COMMA) ) {
                    alt205=1;
                }


                switch (alt205) {
            	case 1 :
            	    // PLSQL_DMLParser.g:948:42: COMMA column_name
            	    {
            	    COMMA631=(Token)match(input,COMMA,FOLLOW_COMMA_in_multi_column_for_loop8995); if (state.failed) return retval; 
            	    if ( state.backtracking==0 ) stream_COMMA.add(COMMA631);


            	    pushFollow(FOLLOW_column_name_in_multi_column_for_loop8997);
            	    column_name632=gPLSQLParser.column_name();

            	    state._fsp--;
            	    if (state.failed) return retval;
            	    if ( state.backtracking==0 ) stream_column_name.add(column_name632.getTree());

            	    }
            	    break;

            	default :
            	    break loop205;
                }
            } while (true);


            RIGHT_PAREN633=(Token)match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_multi_column_for_loop9001); if (state.failed) return retval; 
            if ( state.backtracking==0 ) stream_RIGHT_PAREN.add(RIGHT_PAREN633);


            pushFollow(FOLLOW_in_key_in_multi_column_for_loop9003);
            in_key634=gPLSQLParser.in_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_in_key.add(in_key634.getTree());

            LEFT_PAREN635=(Token)match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_multi_column_for_loop9013); if (state.failed) return retval; 
            if ( state.backtracking==0 ) stream_LEFT_PAREN.add(LEFT_PAREN635);


            // PLSQL_DMLParser.g:950:13: ( ( select_key )=> subquery | ( LEFT_PAREN )=> LEFT_PAREN expression_list ( COMMA expression_list )* RIGHT_PAREN )
            int alt207=2;
            int LA207_0 = input.LA(1);

            if ( (LA207_0==SQL92_RESERVED_SELECT) && (synpred19_PLSQL_DMLParser())) {
                alt207=1;
            }
            else if ( (LA207_0==LEFT_PAREN) ) {
                int LA207_2 = input.LA(2);

                if ( (synpred19_PLSQL_DMLParser()) ) {
                    alt207=1;
                }
                else if ( (synpred20_PLSQL_DMLParser()) ) {
                    alt207=2;
                }
                else {
                    if (state.backtracking>0) {state.failed=true; return retval;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 207, 2, input);

                    throw nvae;

                }
            }
            else {
                if (state.backtracking>0) {state.failed=true; return retval;}
                NoViableAltException nvae =
                    new NoViableAltException("", 207, 0, input);

                throw nvae;

            }
            switch (alt207) {
                case 1 :
                    // PLSQL_DMLParser.g:950:18: ( select_key )=> subquery
                    {
                    pushFollow(FOLLOW_subquery_in_multi_column_for_loop9037);
                    subquery636=subquery();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_subquery.add(subquery636.getTree());

                    }
                    break;
                case 2 :
                    // PLSQL_DMLParser.g:951:18: ( LEFT_PAREN )=> LEFT_PAREN expression_list ( COMMA expression_list )* RIGHT_PAREN
                    {
                    LEFT_PAREN637=(Token)match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_multi_column_for_loop9061); if (state.failed) return retval; 
                    if ( state.backtracking==0 ) stream_LEFT_PAREN.add(LEFT_PAREN637);


                    pushFollow(FOLLOW_expression_list_in_multi_column_for_loop9063);
                    expression_list638=expression_list();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_expression_list.add(expression_list638.getTree());

                    // PLSQL_DMLParser.g:951:60: ( COMMA expression_list )*
                    loop206:
                    do {
                        int alt206=2;
                        int LA206_0 = input.LA(1);

                        if ( (LA206_0==COMMA) ) {
                            alt206=1;
                        }


                        switch (alt206) {
                    	case 1 :
                    	    // PLSQL_DMLParser.g:951:61: COMMA expression_list
                    	    {
                    	    COMMA639=(Token)match(input,COMMA,FOLLOW_COMMA_in_multi_column_for_loop9066); if (state.failed) return retval; 
                    	    if ( state.backtracking==0 ) stream_COMMA.add(COMMA639);


                    	    pushFollow(FOLLOW_expression_list_in_multi_column_for_loop9068);
                    	    expression_list640=expression_list();

                    	    state._fsp--;
                    	    if (state.failed) return retval;
                    	    if ( state.backtracking==0 ) stream_expression_list.add(expression_list640.getTree());

                    	    }
                    	    break;

                    	default :
                    	    break loop206;
                        }
                    } while (true);


                    RIGHT_PAREN641=(Token)match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_multi_column_for_loop9072); if (state.failed) return retval; 
                    if ( state.backtracking==0 ) stream_RIGHT_PAREN.add(RIGHT_PAREN641);


                    }
                    break;

            }


            RIGHT_PAREN642=(Token)match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_multi_column_for_loop9096); if (state.failed) return retval; 
            if ( state.backtracking==0 ) stream_RIGHT_PAREN.add(RIGHT_PAREN642);


            // AST REWRITE
            // elements: in_key, subquery, column_name, expression_list
            // token labels: 
            // rule labels: retval
            // token list labels: 
            // rule list labels: 
            // wildcard labels: 
            if ( state.backtracking==0 ) {

            retval.tree = root_0;
            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

            root_0 = (Object)adaptor.nil();
            // 954:9: -> ^( FOR_MULTI_COLUMN[$for_key.start] ( column_name )+ ^( in_key ( subquery )? ( expression_list )* ) )
            {
                // PLSQL_DMLParser.g:954:12: ^( FOR_MULTI_COLUMN[$for_key.start] ( column_name )+ ^( in_key ( subquery )? ( expression_list )* ) )
                {
                Object root_1 = (Object)adaptor.nil();
                root_1 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(FOR_MULTI_COLUMN, (for_key628!=null?((Token)for_key628.start):null))
                , root_1);

                if ( !(stream_column_name.hasNext()) ) {
                    throw new RewriteEarlyExitException();
                }
                while ( stream_column_name.hasNext() ) {
                    adaptor.addChild(root_1, stream_column_name.nextTree());

                }
                stream_column_name.reset();

                // PLSQL_DMLParser.g:954:60: ^( in_key ( subquery )? ( expression_list )* )
                {
                Object root_2 = (Object)adaptor.nil();
                root_2 = (Object)adaptor.becomeRoot(stream_in_key.nextNode(), root_2);

                // PLSQL_DMLParser.g:954:69: ( subquery )?
                if ( stream_subquery.hasNext() ) {
                    adaptor.addChild(root_2, stream_subquery.nextTree());

                }
                stream_subquery.reset();

                // PLSQL_DMLParser.g:954:79: ( expression_list )*
                while ( stream_expression_list.hasNext() ) {
                    adaptor.addChild(root_2, stream_expression_list.nextTree());

                }
                stream_expression_list.reset();

                adaptor.addChild(root_1, root_2);
                }

                adaptor.addChild(root_0, root_1);
                }

            }


            retval.tree = root_0;
            }

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "multi_column_for_loop"


    public static class keep_expression_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "keep_expression"
    // PLSQL_DMLParser.g:957:1: keep_expression : unary_expression ( keep_key ^ LEFT_PAREN ! dense_rank_key ( first_key | last_key ) order_by_clause RIGHT_PAREN ! ( over_clause )? )? ;
    public final PLSQLParser_PLSQL_DMLParser.keep_expression_return keep_expression() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.keep_expression_return retval = new PLSQLParser_PLSQL_DMLParser.keep_expression_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token LEFT_PAREN645=null;
        Token RIGHT_PAREN650=null;
        PLSQLParser_PLSQL_DMLParser.unary_expression_return unary_expression643 =null;

        PLSQLParser_PLSQLKeys.keep_key_return keep_key644 =null;

        PLSQLParser_PLSQLKeys.dense_rank_key_return dense_rank_key646 =null;

        PLSQLParser_PLSQLKeys.first_key_return first_key647 =null;

        PLSQLParser_PLSQLKeys.last_key_return last_key648 =null;

        PLSQLParser_PLSQL_DMLParser.order_by_clause_return order_by_clause649 =null;

        PLSQLParser_PLSQL_DMLParser.over_clause_return over_clause651 =null;


        Object LEFT_PAREN645_tree=null;
        Object RIGHT_PAREN650_tree=null;

        try {
            // PLSQL_DMLParser.g:958:5: ( unary_expression ( keep_key ^ LEFT_PAREN ! dense_rank_key ( first_key | last_key ) order_by_clause RIGHT_PAREN ! ( over_clause )? )? )
            // PLSQL_DMLParser.g:958:10: unary_expression ( keep_key ^ LEFT_PAREN ! dense_rank_key ( first_key | last_key ) order_by_clause RIGHT_PAREN ! ( over_clause )? )?
            {
            root_0 = (Object)adaptor.nil();


            pushFollow(FOLLOW_unary_expression_in_keep_expression9144);
            unary_expression643=unary_expression();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) adaptor.addChild(root_0, unary_expression643.getTree());

            // PLSQL_DMLParser.g:959:5: ( keep_key ^ LEFT_PAREN ! dense_rank_key ( first_key | last_key ) order_by_clause RIGHT_PAREN ! ( over_clause )? )?
            int alt210=2;
            int LA210_0 = input.LA(1);

            if ( (LA210_0==REGULAR_ID) ) {
                int LA210_1 = input.LA(2);

                if ( ((input.LT(1).getText().equalsIgnoreCase("keep"))) ) {
                    alt210=1;
                }
            }
            switch (alt210) {
                case 1 :
                    // PLSQL_DMLParser.g:959:10: keep_key ^ LEFT_PAREN ! dense_rank_key ( first_key | last_key ) order_by_clause RIGHT_PAREN ! ( over_clause )?
                    {
                    pushFollow(FOLLOW_keep_key_in_keep_expression9155);
                    keep_key644=gPLSQLParser.keep_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) root_0 = (Object)adaptor.becomeRoot(keep_key644.getTree(), root_0);

                    LEFT_PAREN645=(Token)match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_keep_expression9167); if (state.failed) return retval;

                    pushFollow(FOLLOW_dense_rank_key_in_keep_expression9183);
                    dense_rank_key646=gPLSQLParser.dense_rank_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, dense_rank_key646.getTree());

                    // PLSQL_DMLParser.g:961:28: ( first_key | last_key )
                    int alt208=2;
                    int LA208_0 = input.LA(1);

                    if ( (LA208_0==REGULAR_ID) && (((input.LT(1).getText().equalsIgnoreCase("first"))||(input.LT(1).getText().equalsIgnoreCase("last"))))) {
                        int LA208_1 = input.LA(2);

                        if ( ((input.LT(1).getText().equalsIgnoreCase("first"))) ) {
                            alt208=1;
                        }
                        else if ( ((input.LT(1).getText().equalsIgnoreCase("last"))) ) {
                            alt208=2;
                        }
                        else {
                            if (state.backtracking>0) {state.failed=true; return retval;}
                            NoViableAltException nvae =
                                new NoViableAltException("", 208, 1, input);

                            throw nvae;

                        }
                    }
                    else {
                        if (state.backtracking>0) {state.failed=true; return retval;}
                        NoViableAltException nvae =
                            new NoViableAltException("", 208, 0, input);

                        throw nvae;

                    }
                    switch (alt208) {
                        case 1 :
                            // PLSQL_DMLParser.g:961:29: first_key
                            {
                            pushFollow(FOLLOW_first_key_in_keep_expression9186);
                            first_key647=gPLSQLParser.first_key();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) adaptor.addChild(root_0, first_key647.getTree());

                            }
                            break;
                        case 2 :
                            // PLSQL_DMLParser.g:961:39: last_key
                            {
                            pushFollow(FOLLOW_last_key_in_keep_expression9188);
                            last_key648=gPLSQLParser.last_key();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) adaptor.addChild(root_0, last_key648.getTree());

                            }
                            break;

                    }


                    pushFollow(FOLLOW_order_by_clause_in_keep_expression9204);
                    order_by_clause649=order_by_clause();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, order_by_clause649.getTree());

                    RIGHT_PAREN650=(Token)match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_keep_expression9214); if (state.failed) return retval;

                    // PLSQL_DMLParser.g:963:22: ( over_clause )?
                    int alt209=2;
                    int LA209_0 = input.LA(1);

                    if ( (LA209_0==REGULAR_ID) ) {
                        int LA209_1 = input.LA(2);

                        if ( (LA209_1==LEFT_PAREN) ) {
                            int LA209_3 = input.LA(3);

                            if ( (LA209_3==REGULAR_ID) ) {
                                int LA209_10 = input.LA(4);

                                if ( (LA209_10==SQL92_RESERVED_BY) && ((input.LT(1).getText().equalsIgnoreCase("over")))) {
                                    alt209=1;
                                }
                            }
                            else if ( (LA209_3==RIGHT_PAREN||LA209_3==SQL92_RESERVED_ORDER) && ((input.LT(1).getText().equalsIgnoreCase("over")))) {
                                alt209=1;
                            }
                        }
                    }
                    switch (alt209) {
                        case 1 :
                            // PLSQL_DMLParser.g:963:22: over_clause
                            {
                            pushFollow(FOLLOW_over_clause_in_keep_expression9217);
                            over_clause651=over_clause();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) adaptor.addChild(root_0, over_clause651.getTree());

                            }
                            break;

                    }


                    }
                    break;

            }


            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "keep_expression"


    public static class unary_expression_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "unary_expression"
    // PLSQL_DMLParser.g:966:1: unary_expression : ( MINUS_SIGN unary_expression -> ^( UNARY_OPERATOR[$MINUS_SIGN] unary_expression ) | PLUS_SIGN unary_expression -> ^( UNARY_OPERATOR[$PLUS_SIGN] unary_expression ) | prior_key ^ unary_expression |{...}? => new_key ^ unary_expression | distinct_key ^ unary_expression | all_key ^ unary_expression |{...}? case_statement[false] | quantified_expression | standard_function -> ^( STANDARD_FUNCTION standard_function ) | atom );
    public final PLSQLParser_PLSQL_DMLParser.unary_expression_return unary_expression() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.unary_expression_return retval = new PLSQLParser_PLSQL_DMLParser.unary_expression_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token MINUS_SIGN652=null;
        Token PLUS_SIGN654=null;
        PLSQLParser_PLSQL_DMLParser.unary_expression_return unary_expression653 =null;

        PLSQLParser_PLSQL_DMLParser.unary_expression_return unary_expression655 =null;

        PLSQLParser_PLSQLKeys.prior_key_return prior_key656 =null;

        PLSQLParser_PLSQL_DMLParser.unary_expression_return unary_expression657 =null;

        PLSQLParser_PLSQLKeys.new_key_return new_key658 =null;

        PLSQLParser_PLSQL_DMLParser.unary_expression_return unary_expression659 =null;

        PLSQLParser_PLSQLKeys.distinct_key_return distinct_key660 =null;

        PLSQLParser_PLSQL_DMLParser.unary_expression_return unary_expression661 =null;

        PLSQLParser_PLSQLKeys.all_key_return all_key662 =null;

        PLSQLParser_PLSQL_DMLParser.unary_expression_return unary_expression663 =null;

        PLSQLParser_PLSQL_DMLParser.case_statement_return case_statement664 =null;

        PLSQLParser_PLSQL_DMLParser.quantified_expression_return quantified_expression665 =null;

        PLSQLParser_PLSQL_DMLParser.standard_function_return standard_function666 =null;

        PLSQLParser_PLSQL_DMLParser.atom_return atom667 =null;


        Object MINUS_SIGN652_tree=null;
        Object PLUS_SIGN654_tree=null;
        RewriteRuleTokenStream stream_PLUS_SIGN=new RewriteRuleTokenStream(adaptor,"token PLUS_SIGN");
        RewriteRuleTokenStream stream_MINUS_SIGN=new RewriteRuleTokenStream(adaptor,"token MINUS_SIGN");
        RewriteRuleSubtreeStream stream_unary_expression=new RewriteRuleSubtreeStream(adaptor,"rule unary_expression");
        RewriteRuleSubtreeStream stream_standard_function=new RewriteRuleSubtreeStream(adaptor,"rule standard_function");
        try {
            // PLSQL_DMLParser.g:967:5: ( MINUS_SIGN unary_expression -> ^( UNARY_OPERATOR[$MINUS_SIGN] unary_expression ) | PLUS_SIGN unary_expression -> ^( UNARY_OPERATOR[$PLUS_SIGN] unary_expression ) | prior_key ^ unary_expression |{...}? => new_key ^ unary_expression | distinct_key ^ unary_expression | all_key ^ unary_expression |{...}? case_statement[false] | quantified_expression | standard_function -> ^( STANDARD_FUNCTION standard_function ) | atom )
            int alt211=10;
            switch ( input.LA(1) ) {
            case MINUS_SIGN:
                {
                alt211=1;
                }
                break;
            case PLUS_SIGN:
                {
                alt211=2;
                }
                break;
            case SQL92_RESERVED_PRIOR:
                {
                alt211=3;
                }
                break;
            case REGULAR_ID:
                {
                int LA211_4 = input.LA(2);

                if ( ((((input.LT(1).getText().equalsIgnoreCase("new") && !input.LT(2).getText().equals("."))&&(input.LT(1).getText().equalsIgnoreCase("new") && !input.LT(2).getText().equals(".")))&&(input.LT(1).getText().equalsIgnoreCase("new")))) ) {
                    alt211=4;
                }
                else if ( (((input.LA(1) == SQL92_RESERVED_CASE || input.LA(2) == SQL92_RESERVED_CASE))) ) {
                    alt211=7;
                }
                else if ( ((input.LT(1).getText().equalsIgnoreCase("some"))) ) {
                    alt211=8;
                }
                else if ( (((input.LT(1).getText().equalsIgnoreCase("xmlelement"))||(input.LT(1).getText().equalsIgnoreCase("xmlcolattval"))||(input.LT(1).getText().equalsIgnoreCase("last_value"))||(input.LT(1).getText().equalsIgnoreCase("xmlforest"))||(input.LT(1).getText().equalsIgnoreCase("cast"))||(input.LT(1).getText().equalsIgnoreCase("xmlparse"))||(input.LT(1).getText().equalsIgnoreCase("xmlroot"))||(input.LT(1).getText().equalsIgnoreCase("xmltable"))||(enablesUsingClause(input.LT(1).getText()))||(input.LT(1).getText().equalsIgnoreCase("trim"))||(input.LT(1).getText().equalsIgnoreCase("decompose"))||(input.LT(1).getText().equalsIgnoreCase("xmlcast"))||(input.LT(1).getText().equalsIgnoreCase("xmlquery"))||(input.LT(1).getText().equalsIgnoreCase("xmlpi"))||(input.LT(1).getText().equalsIgnoreCase("treat"))||(input.LT(1).getText().equalsIgnoreCase("extract"))||(input.LT(1).getText().equalsIgnoreCase("xmlexists"))||(enablesOverClause(input.LT(1).getText()))||(input.LT(1).getText().equalsIgnoreCase("xmlagg"))||(input.LT(1).getText().equalsIgnoreCase("chr"))||(isStandardPredictionFunction(input.LT(1).getText()))||(input.LT(1).getText().equalsIgnoreCase("count"))||(enablesWithinOrOverClause(input.LT(1).getText()))||(input.LT(1).getText().equalsIgnoreCase("translate"))||(input.LT(1).getText().equalsIgnoreCase("xmlserialize"))||(input.LT(1).getText().equalsIgnoreCase("first_value"))||(input.LT(1).getText().equalsIgnoreCase("collect")))) ) {
                    alt211=9;
                }
                else if ( (true) ) {
                    alt211=10;
                }
                else {
                    if (state.backtracking>0) {state.failed=true; return retval;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 211, 4, input);

                    throw nvae;

                }
                }
                break;
            case SQL92_RESERVED_DISTINCT:
                {
                alt211=5;
                }
                break;
            case SQL92_RESERVED_ALL:
                {
                alt211=6;
                }
                break;
            case DELIMITED_ID:
                {
                int LA211_7 = input.LA(2);

                if ( (((input.LA(1) == SQL92_RESERVED_CASE || input.LA(2) == SQL92_RESERVED_CASE))) ) {
                    alt211=7;
                }
                else if ( (true) ) {
                    alt211=10;
                }
                else {
                    if (state.backtracking>0) {state.failed=true; return retval;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 211, 7, input);

                    throw nvae;

                }
                }
                break;
            case SQL92_RESERVED_CASE:
                {
                alt211=7;
                }
                break;
            case SQL92_RESERVED_ANY:
            case SQL92_RESERVED_EXISTS:
                {
                alt211=8;
                }
                break;
            case APPROXIMATE_NUM_LIT:
            case CHAR_STRING:
            case COLON:
            case EXACT_NUM_LIT:
            case INTRODUCER:
            case LEFT_PAREN:
            case SQL92_RESERVED_DEFAULT:
            case SQL92_RESERVED_FALSE:
            case SQL92_RESERVED_NULL:
            case SQL92_RESERVED_TRUE:
            case UNSIGNED_INTEGER:
                {
                alt211=10;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return retval;}
                NoViableAltException nvae =
                    new NoViableAltException("", 211, 0, input);

                throw nvae;

            }

            switch (alt211) {
                case 1 :
                    // PLSQL_DMLParser.g:967:10: MINUS_SIGN unary_expression
                    {
                    MINUS_SIGN652=(Token)match(input,MINUS_SIGN,FOLLOW_MINUS_SIGN_in_unary_expression9244); if (state.failed) return retval; 
                    if ( state.backtracking==0 ) stream_MINUS_SIGN.add(MINUS_SIGN652);


                    pushFollow(FOLLOW_unary_expression_in_unary_expression9246);
                    unary_expression653=unary_expression();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_unary_expression.add(unary_expression653.getTree());

                    // AST REWRITE
                    // elements: unary_expression
                    // token labels: 
                    // rule labels: retval
                    // token list labels: 
                    // rule list labels: 
                    // wildcard labels: 
                    if ( state.backtracking==0 ) {

                    retval.tree = root_0;
                    RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

                    root_0 = (Object)adaptor.nil();
                    // 967:38: -> ^( UNARY_OPERATOR[$MINUS_SIGN] unary_expression )
                    {
                        // PLSQL_DMLParser.g:967:41: ^( UNARY_OPERATOR[$MINUS_SIGN] unary_expression )
                        {
                        Object root_1 = (Object)adaptor.nil();
                        root_1 = (Object)adaptor.becomeRoot(
                        (Object)adaptor.create(UNARY_OPERATOR, MINUS_SIGN652)
                        , root_1);

                        adaptor.addChild(root_1, stream_unary_expression.nextTree());

                        adaptor.addChild(root_0, root_1);
                        }

                    }


                    retval.tree = root_0;
                    }

                    }
                    break;
                case 2 :
                    // PLSQL_DMLParser.g:968:10: PLUS_SIGN unary_expression
                    {
                    PLUS_SIGN654=(Token)match(input,PLUS_SIGN,FOLLOW_PLUS_SIGN_in_unary_expression9266); if (state.failed) return retval; 
                    if ( state.backtracking==0 ) stream_PLUS_SIGN.add(PLUS_SIGN654);


                    pushFollow(FOLLOW_unary_expression_in_unary_expression9268);
                    unary_expression655=unary_expression();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_unary_expression.add(unary_expression655.getTree());

                    // AST REWRITE
                    // elements: unary_expression
                    // token labels: 
                    // rule labels: retval
                    // token list labels: 
                    // rule list labels: 
                    // wildcard labels: 
                    if ( state.backtracking==0 ) {

                    retval.tree = root_0;
                    RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

                    root_0 = (Object)adaptor.nil();
                    // 968:37: -> ^( UNARY_OPERATOR[$PLUS_SIGN] unary_expression )
                    {
                        // PLSQL_DMLParser.g:968:40: ^( UNARY_OPERATOR[$PLUS_SIGN] unary_expression )
                        {
                        Object root_1 = (Object)adaptor.nil();
                        root_1 = (Object)adaptor.becomeRoot(
                        (Object)adaptor.create(UNARY_OPERATOR, PLUS_SIGN654)
                        , root_1);

                        adaptor.addChild(root_1, stream_unary_expression.nextTree());

                        adaptor.addChild(root_0, root_1);
                        }

                    }


                    retval.tree = root_0;
                    }

                    }
                    break;
                case 3 :
                    // PLSQL_DMLParser.g:969:10: prior_key ^ unary_expression
                    {
                    root_0 = (Object)adaptor.nil();


                    pushFollow(FOLLOW_prior_key_in_unary_expression9288);
                    prior_key656=gPLSQLParser.prior_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) root_0 = (Object)adaptor.becomeRoot(prior_key656.getTree(), root_0);

                    pushFollow(FOLLOW_unary_expression_in_unary_expression9291);
                    unary_expression657=unary_expression();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, unary_expression657.getTree());

                    }
                    break;
                case 4 :
                    // PLSQL_DMLParser.g:970:10: {...}? => new_key ^ unary_expression
                    {
                    root_0 = (Object)adaptor.nil();


                    if ( !((input.LT(1).getText().equalsIgnoreCase("new") && !input.LT(2).getText().equals("."))) ) {
                        if (state.backtracking>0) {state.failed=true; return retval;}
                        throw new FailedPredicateException(input, "unary_expression", "input.LT(1).getText().equalsIgnoreCase(\"new\") && !input.LT(2).getText().equals(\".\")");
                    }

                    pushFollow(FOLLOW_new_key_in_unary_expression9305);
                    new_key658=gPLSQLParser.new_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) root_0 = (Object)adaptor.becomeRoot(new_key658.getTree(), root_0);

                    pushFollow(FOLLOW_unary_expression_in_unary_expression9308);
                    unary_expression659=unary_expression();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, unary_expression659.getTree());

                    }
                    break;
                case 5 :
                    // PLSQL_DMLParser.g:971:10: distinct_key ^ unary_expression
                    {
                    root_0 = (Object)adaptor.nil();


                    pushFollow(FOLLOW_distinct_key_in_unary_expression9319);
                    distinct_key660=gPLSQLParser.distinct_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) root_0 = (Object)adaptor.becomeRoot(distinct_key660.getTree(), root_0);

                    pushFollow(FOLLOW_unary_expression_in_unary_expression9322);
                    unary_expression661=unary_expression();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, unary_expression661.getTree());

                    }
                    break;
                case 6 :
                    // PLSQL_DMLParser.g:972:10: all_key ^ unary_expression
                    {
                    root_0 = (Object)adaptor.nil();


                    pushFollow(FOLLOW_all_key_in_unary_expression9333);
                    all_key662=gPLSQLParser.all_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) root_0 = (Object)adaptor.becomeRoot(all_key662.getTree(), root_0);

                    pushFollow(FOLLOW_unary_expression_in_unary_expression9336);
                    unary_expression663=unary_expression();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, unary_expression663.getTree());

                    }
                    break;
                case 7 :
                    // PLSQL_DMLParser.g:973:10: {...}? case_statement[false]
                    {
                    root_0 = (Object)adaptor.nil();


                    if ( !(((input.LA(1) == SQL92_RESERVED_CASE || input.LA(2) == SQL92_RESERVED_CASE))) ) {
                        if (state.backtracking>0) {state.failed=true; return retval;}
                        throw new FailedPredicateException(input, "unary_expression", "(input.LA(1) == SQL92_RESERVED_CASE || input.LA(2) == SQL92_RESERVED_CASE)");
                    }

                    pushFollow(FOLLOW_case_statement_in_unary_expression9349);
                    case_statement664=case_statement(false);

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, case_statement664.getTree());

                    }
                    break;
                case 8 :
                    // PLSQL_DMLParser.g:974:10: quantified_expression
                    {
                    root_0 = (Object)adaptor.nil();


                    pushFollow(FOLLOW_quantified_expression_in_unary_expression9361);
                    quantified_expression665=quantified_expression();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, quantified_expression665.getTree());

                    }
                    break;
                case 9 :
                    // PLSQL_DMLParser.g:975:10: standard_function
                    {
                    pushFollow(FOLLOW_standard_function_in_unary_expression9372);
                    standard_function666=standard_function();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_standard_function.add(standard_function666.getTree());

                    // AST REWRITE
                    // elements: standard_function
                    // token labels: 
                    // rule labels: retval
                    // token list labels: 
                    // rule list labels: 
                    // wildcard labels: 
                    if ( state.backtracking==0 ) {

                    retval.tree = root_0;
                    RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

                    root_0 = (Object)adaptor.nil();
                    // 975:28: -> ^( STANDARD_FUNCTION standard_function )
                    {
                        // PLSQL_DMLParser.g:975:31: ^( STANDARD_FUNCTION standard_function )
                        {
                        Object root_1 = (Object)adaptor.nil();
                        root_1 = (Object)adaptor.becomeRoot(
                        (Object)adaptor.create(STANDARD_FUNCTION, "STANDARD_FUNCTION")
                        , root_1);

                        adaptor.addChild(root_1, stream_standard_function.nextTree());

                        adaptor.addChild(root_0, root_1);
                        }

                    }


                    retval.tree = root_0;
                    }

                    }
                    break;
                case 10 :
                    // PLSQL_DMLParser.g:976:10: atom
                    {
                    root_0 = (Object)adaptor.nil();


                    pushFollow(FOLLOW_atom_in_unary_expression9391);
                    atom667=atom();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, atom667.getTree());

                    }
                    break;

            }
            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "unary_expression"


    protected static class case_statement_scope {
        boolean isStatement;
    }
    protected Stack case_statement_stack = new Stack();


    public static class case_statement_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "case_statement"
    // PLSQL_DMLParser.g:979:1: case_statement[boolean isStatementParameter] : ( ( ( label_name )? case_key when_key )=> searched_case_statement | simple_case_statement );
    public final PLSQLParser_PLSQL_DMLParser.case_statement_return case_statement(boolean isStatementParameter) throws RecognitionException {
        case_statement_stack.push(new case_statement_scope());
        PLSQLParser_PLSQL_DMLParser.case_statement_return retval = new PLSQLParser_PLSQL_DMLParser.case_statement_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        PLSQLParser_PLSQL_DMLParser.searched_case_statement_return searched_case_statement668 =null;

        PLSQLParser_PLSQL_DMLParser.simple_case_statement_return simple_case_statement669 =null;



        ((case_statement_scope)case_statement_stack.peek()).isStatement = isStatementParameter;
        try {
            // PLSQL_DMLParser.g:984:5: ( ( ( label_name )? case_key when_key )=> searched_case_statement | simple_case_statement )
            int alt212=2;
            switch ( input.LA(1) ) {
            case REGULAR_ID:
                {
                int LA212_1 = input.LA(2);

                if ( (LA212_1==SQL92_RESERVED_CASE) ) {
                    int LA212_3 = input.LA(3);

                    if ( (LA212_3==SQL92_RESERVED_WHEN) && (synpred21_PLSQL_DMLParser())) {
                        alt212=1;
                    }
                    else if ( (LA212_3==APPROXIMATE_NUM_LIT||(LA212_3 >= CHAR_STRING && LA212_3 <= COLON)||LA212_3==DELIMITED_ID||LA212_3==EXACT_NUM_LIT||LA212_3==INTRODUCER||LA212_3==LEFT_PAREN||LA212_3==REGULAR_ID||LA212_3==SQL92_RESERVED_DEFAULT||LA212_3==SQL92_RESERVED_FALSE||LA212_3==SQL92_RESERVED_NULL||LA212_3==SQL92_RESERVED_TRUE||LA212_3==UNSIGNED_INTEGER) ) {
                        alt212=2;
                    }
                    else {
                        if (state.backtracking>0) {state.failed=true; return retval;}
                        NoViableAltException nvae =
                            new NoViableAltException("", 212, 3, input);

                        throw nvae;

                    }
                }
                else {
                    if (state.backtracking>0) {state.failed=true; return retval;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 212, 1, input);

                    throw nvae;

                }
                }
                break;
            case DELIMITED_ID:
                {
                int LA212_2 = input.LA(2);

                if ( (LA212_2==SQL92_RESERVED_CASE) ) {
                    int LA212_3 = input.LA(3);

                    if ( (LA212_3==SQL92_RESERVED_WHEN) && (synpred21_PLSQL_DMLParser())) {
                        alt212=1;
                    }
                    else if ( (LA212_3==APPROXIMATE_NUM_LIT||(LA212_3 >= CHAR_STRING && LA212_3 <= COLON)||LA212_3==DELIMITED_ID||LA212_3==EXACT_NUM_LIT||LA212_3==INTRODUCER||LA212_3==LEFT_PAREN||LA212_3==REGULAR_ID||LA212_3==SQL92_RESERVED_DEFAULT||LA212_3==SQL92_RESERVED_FALSE||LA212_3==SQL92_RESERVED_NULL||LA212_3==SQL92_RESERVED_TRUE||LA212_3==UNSIGNED_INTEGER) ) {
                        alt212=2;
                    }
                    else {
                        if (state.backtracking>0) {state.failed=true; return retval;}
                        NoViableAltException nvae =
                            new NoViableAltException("", 212, 3, input);

                        throw nvae;

                    }
                }
                else {
                    if (state.backtracking>0) {state.failed=true; return retval;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 212, 2, input);

                    throw nvae;

                }
                }
                break;
            case SQL92_RESERVED_CASE:
                {
                int LA212_3 = input.LA(2);

                if ( (LA212_3==SQL92_RESERVED_WHEN) && (synpred21_PLSQL_DMLParser())) {
                    alt212=1;
                }
                else if ( (LA212_3==APPROXIMATE_NUM_LIT||(LA212_3 >= CHAR_STRING && LA212_3 <= COLON)||LA212_3==DELIMITED_ID||LA212_3==EXACT_NUM_LIT||LA212_3==INTRODUCER||LA212_3==LEFT_PAREN||LA212_3==REGULAR_ID||LA212_3==SQL92_RESERVED_DEFAULT||LA212_3==SQL92_RESERVED_FALSE||LA212_3==SQL92_RESERVED_NULL||LA212_3==SQL92_RESERVED_TRUE||LA212_3==UNSIGNED_INTEGER) ) {
                    alt212=2;
                }
                else {
                    if (state.backtracking>0) {state.failed=true; return retval;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 212, 3, input);

                    throw nvae;

                }
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return retval;}
                NoViableAltException nvae =
                    new NoViableAltException("", 212, 0, input);

                throw nvae;

            }

            switch (alt212) {
                case 1 :
                    // PLSQL_DMLParser.g:984:10: ( ( label_name )? case_key when_key )=> searched_case_statement
                    {
                    root_0 = (Object)adaptor.nil();


                    pushFollow(FOLLOW_searched_case_statement_in_case_statement9438);
                    searched_case_statement668=searched_case_statement();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, searched_case_statement668.getTree());

                    }
                    break;
                case 2 :
                    // PLSQL_DMLParser.g:985:10: simple_case_statement
                    {
                    root_0 = (Object)adaptor.nil();


                    pushFollow(FOLLOW_simple_case_statement_in_case_statement9449);
                    simple_case_statement669=simple_case_statement();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, simple_case_statement669.getTree());

                    }
                    break;

            }
            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
            case_statement_stack.pop();
        }
        return retval;
    }
    // $ANTLR end "case_statement"


    public static class simple_case_statement_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "simple_case_statement"
    // PLSQL_DMLParser.g:990:1: simple_case_statement : ( label_name )? ck1= case_key atom ( simple_case_when_part )+ ( case_else_part )? end_key ( case_key )? ( label_name )? -> ^( SIMPLE_CASE[$ck1.start] ( label_name )* ^( EXPR atom ) ( simple_case_when_part )+ ( case_else_part )? ) ;
    public final PLSQLParser_PLSQL_DMLParser.simple_case_statement_return simple_case_statement() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.simple_case_statement_return retval = new PLSQLParser_PLSQL_DMLParser.simple_case_statement_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        PLSQLParser_PLSQLKeys.case_key_return ck1 =null;

        PLSQLParser_PLSQLCommons.label_name_return label_name670 =null;

        PLSQLParser_PLSQL_DMLParser.atom_return atom671 =null;

        PLSQLParser_PLSQL_DMLParser.simple_case_when_part_return simple_case_when_part672 =null;

        PLSQLParser_PLSQL_DMLParser.case_else_part_return case_else_part673 =null;

        PLSQLParser_PLSQLKeys.end_key_return end_key674 =null;

        PLSQLParser_PLSQLKeys.case_key_return case_key675 =null;

        PLSQLParser_PLSQLCommons.label_name_return label_name676 =null;


        RewriteRuleSubtreeStream stream_atom=new RewriteRuleSubtreeStream(adaptor,"rule atom");
        RewriteRuleSubtreeStream stream_simple_case_when_part=new RewriteRuleSubtreeStream(adaptor,"rule simple_case_when_part");
        RewriteRuleSubtreeStream stream_label_name=new RewriteRuleSubtreeStream(adaptor,"rule label_name");
        RewriteRuleSubtreeStream stream_case_else_part=new RewriteRuleSubtreeStream(adaptor,"rule case_else_part");
        RewriteRuleSubtreeStream stream_case_key=new RewriteRuleSubtreeStream(adaptor,"rule case_key");
        RewriteRuleSubtreeStream stream_end_key=new RewriteRuleSubtreeStream(adaptor,"rule end_key");
        try {
            // PLSQL_DMLParser.g:991:5: ( ( label_name )? ck1= case_key atom ( simple_case_when_part )+ ( case_else_part )? end_key ( case_key )? ( label_name )? -> ^( SIMPLE_CASE[$ck1.start] ( label_name )* ^( EXPR atom ) ( simple_case_when_part )+ ( case_else_part )? ) )
            // PLSQL_DMLParser.g:991:10: ( label_name )? ck1= case_key atom ( simple_case_when_part )+ ( case_else_part )? end_key ( case_key )? ( label_name )?
            {
            // PLSQL_DMLParser.g:991:10: ( label_name )?
            int alt213=2;
            int LA213_0 = input.LA(1);

            if ( (LA213_0==DELIMITED_ID||LA213_0==REGULAR_ID) ) {
                alt213=1;
            }
            switch (alt213) {
                case 1 :
                    // PLSQL_DMLParser.g:991:10: label_name
                    {
                    pushFollow(FOLLOW_label_name_in_simple_case_statement9471);
                    label_name670=gPLSQLParser.label_name();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_label_name.add(label_name670.getTree());

                    }
                    break;

            }


            pushFollow(FOLLOW_case_key_in_simple_case_statement9476);
            ck1=gPLSQLParser.case_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_case_key.add(ck1.getTree());

            pushFollow(FOLLOW_atom_in_simple_case_statement9478);
            atom671=atom();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_atom.add(atom671.getTree());

            // PLSQL_DMLParser.g:992:9: ( simple_case_when_part )+
            int cnt214=0;
            loop214:
            do {
                int alt214=2;
                int LA214_0 = input.LA(1);

                if ( (LA214_0==SQL92_RESERVED_WHEN) ) {
                    alt214=1;
                }


                switch (alt214) {
            	case 1 :
            	    // PLSQL_DMLParser.g:992:9: simple_case_when_part
            	    {
            	    pushFollow(FOLLOW_simple_case_when_part_in_simple_case_statement9488);
            	    simple_case_when_part672=simple_case_when_part();

            	    state._fsp--;
            	    if (state.failed) return retval;
            	    if ( state.backtracking==0 ) stream_simple_case_when_part.add(simple_case_when_part672.getTree());

            	    }
            	    break;

            	default :
            	    if ( cnt214 >= 1 ) break loop214;
            	    if (state.backtracking>0) {state.failed=true; return retval;}
                        EarlyExitException eee =
                            new EarlyExitException(214, input);
                        throw eee;
                }
                cnt214++;
            } while (true);


            // PLSQL_DMLParser.g:993:9: ( case_else_part )?
            int alt215=2;
            int LA215_0 = input.LA(1);

            if ( (LA215_0==SQL92_RESERVED_ELSE) ) {
                alt215=1;
            }
            switch (alt215) {
                case 1 :
                    // PLSQL_DMLParser.g:993:9: case_else_part
                    {
                    pushFollow(FOLLOW_case_else_part_in_simple_case_statement9500);
                    case_else_part673=case_else_part();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_case_else_part.add(case_else_part673.getTree());

                    }
                    break;

            }


            pushFollow(FOLLOW_end_key_in_simple_case_statement9511);
            end_key674=gPLSQLParser.end_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_end_key.add(end_key674.getTree());

            // PLSQL_DMLParser.g:994:17: ( case_key )?
            int alt216=2;
            int LA216_0 = input.LA(1);

            if ( (LA216_0==SQL92_RESERVED_CASE) ) {
                alt216=1;
            }
            switch (alt216) {
                case 1 :
                    // PLSQL_DMLParser.g:994:17: case_key
                    {
                    pushFollow(FOLLOW_case_key_in_simple_case_statement9513);
                    case_key675=gPLSQLParser.case_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_case_key.add(case_key675.getTree());

                    }
                    break;

            }


            // PLSQL_DMLParser.g:994:27: ( label_name )?
            int alt217=2;
            int LA217_0 = input.LA(1);

            if ( (LA217_0==REGULAR_ID) ) {
                alt217=1;
            }
            else if ( (LA217_0==DELIMITED_ID) ) {
                alt217=1;
            }
            switch (alt217) {
                case 1 :
                    // PLSQL_DMLParser.g:994:27: label_name
                    {
                    pushFollow(FOLLOW_label_name_in_simple_case_statement9516);
                    label_name676=gPLSQLParser.label_name();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_label_name.add(label_name676.getTree());

                    }
                    break;

            }


            // AST REWRITE
            // elements: atom, case_else_part, label_name, simple_case_when_part
            // token labels: 
            // rule labels: retval
            // token list labels: 
            // rule list labels: 
            // wildcard labels: 
            if ( state.backtracking==0 ) {

            retval.tree = root_0;
            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

            root_0 = (Object)adaptor.nil();
            // 995:9: -> ^( SIMPLE_CASE[$ck1.start] ( label_name )* ^( EXPR atom ) ( simple_case_when_part )+ ( case_else_part )? )
            {
                // PLSQL_DMLParser.g:995:12: ^( SIMPLE_CASE[$ck1.start] ( label_name )* ^( EXPR atom ) ( simple_case_when_part )+ ( case_else_part )? )
                {
                Object root_1 = (Object)adaptor.nil();
                root_1 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(SIMPLE_CASE, (ck1!=null?((Token)ck1.start):null))
                , root_1);

                // PLSQL_DMLParser.g:995:38: ( label_name )*
                while ( stream_label_name.hasNext() ) {
                    adaptor.addChild(root_1, stream_label_name.nextTree());

                }
                stream_label_name.reset();

                // PLSQL_DMLParser.g:995:50: ^( EXPR atom )
                {
                Object root_2 = (Object)adaptor.nil();
                root_2 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(EXPR, "EXPR")
                , root_2);

                adaptor.addChild(root_2, stream_atom.nextTree());

                adaptor.addChild(root_1, root_2);
                }

                if ( !(stream_simple_case_when_part.hasNext()) ) {
                    throw new RewriteEarlyExitException();
                }
                while ( stream_simple_case_when_part.hasNext() ) {
                    adaptor.addChild(root_1, stream_simple_case_when_part.nextTree());

                }
                stream_simple_case_when_part.reset();

                // PLSQL_DMLParser.g:995:86: ( case_else_part )?
                if ( stream_case_else_part.hasNext() ) {
                    adaptor.addChild(root_1, stream_case_else_part.nextTree());

                }
                stream_case_else_part.reset();

                adaptor.addChild(root_0, root_1);
                }

            }


            retval.tree = root_0;
            }

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "simple_case_statement"


    public static class simple_case_when_part_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "simple_case_when_part"
    // PLSQL_DMLParser.g:998:1: simple_case_when_part : when_key ^ew1= expression_wrapper then_key ! ({...}? seq_of_statements |ew2= expression_wrapper ) ;
    public final PLSQLParser_PLSQL_DMLParser.simple_case_when_part_return simple_case_when_part() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.simple_case_when_part_return retval = new PLSQLParser_PLSQL_DMLParser.simple_case_when_part_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        PLSQLParser_PLSQL_DMLParser.expression_wrapper_return ew1 =null;

        PLSQLParser_PLSQL_DMLParser.expression_wrapper_return ew2 =null;

        PLSQLParser_PLSQLKeys.when_key_return when_key677 =null;

        PLSQLParser_PLSQLKeys.then_key_return then_key678 =null;

        PLSQLParser_PLSQL_DMLParser.seq_of_statements_return seq_of_statements679 =null;



        try {
            // PLSQL_DMLParser.g:999:5: ( when_key ^ew1= expression_wrapper then_key ! ({...}? seq_of_statements |ew2= expression_wrapper ) )
            // PLSQL_DMLParser.g:999:10: when_key ^ew1= expression_wrapper then_key ! ({...}? seq_of_statements |ew2= expression_wrapper )
            {
            root_0 = (Object)adaptor.nil();


            pushFollow(FOLLOW_when_key_in_simple_case_when_part9569);
            when_key677=gPLSQLParser.when_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) root_0 = (Object)adaptor.becomeRoot(when_key677.getTree(), root_0);

            pushFollow(FOLLOW_expression_wrapper_in_simple_case_when_part9574);
            ew1=expression_wrapper();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) adaptor.addChild(root_0, ew1.getTree());

            pushFollow(FOLLOW_then_key_in_simple_case_when_part9576);
            then_key678=gPLSQLParser.then_key();

            state._fsp--;
            if (state.failed) return retval;

            // PLSQL_DMLParser.g:999:53: ({...}? seq_of_statements |ew2= expression_wrapper )
            int alt218=2;
            switch ( input.LA(1) ) {
            case SQL92_RESERVED_DELETE:
            case SQL92_RESERVED_INSERT:
            case SQL92_RESERVED_SELECT:
            case SQL92_RESERVED_UPDATE:
            case SQL92_RESERVED_WITH:
                {
                alt218=1;
                }
                break;
            case LEFT_PAREN:
                {
                int LA218_3 = input.LA(2);

                if ( ((((case_statement_scope)case_statement_stack.peek()).isStatement)) ) {
                    alt218=1;
                }
                else if ( (true) ) {
                    alt218=2;
                }
                else {
                    if (state.backtracking>0) {state.failed=true; return retval;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 218, 3, input);

                    throw nvae;

                }
                }
                break;
            case REGULAR_ID:
                {
                int LA218_7 = input.LA(2);

                if ( ((((case_statement_scope)case_statement_stack.peek()).isStatement)) ) {
                    alt218=1;
                }
                else if ( (true) ) {
                    alt218=2;
                }
                else {
                    if (state.backtracking>0) {state.failed=true; return retval;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 218, 7, input);

                    throw nvae;

                }
                }
                break;
            case DELIMITED_ID:
                {
                int LA218_8 = input.LA(2);

                if ( ((((case_statement_scope)case_statement_stack.peek()).isStatement)) ) {
                    alt218=1;
                }
                else if ( (true) ) {
                    alt218=2;
                }
                else {
                    if (state.backtracking>0) {state.failed=true; return retval;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 218, 8, input);

                    throw nvae;

                }
                }
                break;
            case SQL92_RESERVED_CASE:
                {
                int LA218_9 = input.LA(2);

                if ( ((((case_statement_scope)case_statement_stack.peek()).isStatement)) ) {
                    alt218=1;
                }
                else if ( (((input.LA(1) == SQL92_RESERVED_CASE || input.LA(2) == SQL92_RESERVED_CASE))) ) {
                    alt218=2;
                }
                else {
                    if (state.backtracking>0) {state.failed=true; return retval;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 218, 9, input);

                    throw nvae;

                }
                }
                break;
            case APPROXIMATE_NUM_LIT:
            case CHAR_STRING:
            case COLON:
            case EXACT_NUM_LIT:
            case INTRODUCER:
            case MINUS_SIGN:
            case PLUS_SIGN:
            case SQL92_RESERVED_ALL:
            case SQL92_RESERVED_ANY:
            case SQL92_RESERVED_DEFAULT:
            case SQL92_RESERVED_DISTINCT:
            case SQL92_RESERVED_EXISTS:
            case SQL92_RESERVED_FALSE:
            case SQL92_RESERVED_NOT:
            case SQL92_RESERVED_NULL:
            case SQL92_RESERVED_PRIOR:
            case SQL92_RESERVED_TRUE:
            case UNSIGNED_INTEGER:
                {
                alt218=2;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return retval;}
                NoViableAltException nvae =
                    new NoViableAltException("", 218, 0, input);

                throw nvae;

            }

            switch (alt218) {
                case 1 :
                    // PLSQL_DMLParser.g:999:54: {...}? seq_of_statements
                    {
                    if ( !((((case_statement_scope)case_statement_stack.peek()).isStatement)) ) {
                        if (state.backtracking>0) {state.failed=true; return retval;}
                        throw new FailedPredicateException(input, "simple_case_when_part", "$case_statement::isStatement");
                    }

                    pushFollow(FOLLOW_seq_of_statements_in_simple_case_when_part9582);
                    seq_of_statements679=seq_of_statements();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, seq_of_statements679.getTree());

                    }
                    break;
                case 2 :
                    // PLSQL_DMLParser.g:999:106: ew2= expression_wrapper
                    {
                    pushFollow(FOLLOW_expression_wrapper_in_simple_case_when_part9588);
                    ew2=expression_wrapper();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, ew2.getTree());

                    }
                    break;

            }


            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "simple_case_when_part"


    public static class searched_case_statement_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "searched_case_statement"
    // PLSQL_DMLParser.g:1002:1: searched_case_statement : ( label_name )? ck1= case_key ( searched_case_when_part )+ ( case_else_part )? end_key ( case_key )? ( label_name )? -> ^( SEARCHED_CASE[$ck1.start] ( label_name )* ( searched_case_when_part )+ ( case_else_part )? ) ;
    public final PLSQLParser_PLSQL_DMLParser.searched_case_statement_return searched_case_statement() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.searched_case_statement_return retval = new PLSQLParser_PLSQL_DMLParser.searched_case_statement_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        PLSQLParser_PLSQLKeys.case_key_return ck1 =null;

        PLSQLParser_PLSQLCommons.label_name_return label_name680 =null;

        PLSQLParser_PLSQL_DMLParser.searched_case_when_part_return searched_case_when_part681 =null;

        PLSQLParser_PLSQL_DMLParser.case_else_part_return case_else_part682 =null;

        PLSQLParser_PLSQLKeys.end_key_return end_key683 =null;

        PLSQLParser_PLSQLKeys.case_key_return case_key684 =null;

        PLSQLParser_PLSQLCommons.label_name_return label_name685 =null;


        RewriteRuleSubtreeStream stream_searched_case_when_part=new RewriteRuleSubtreeStream(adaptor,"rule searched_case_when_part");
        RewriteRuleSubtreeStream stream_label_name=new RewriteRuleSubtreeStream(adaptor,"rule label_name");
        RewriteRuleSubtreeStream stream_case_else_part=new RewriteRuleSubtreeStream(adaptor,"rule case_else_part");
        RewriteRuleSubtreeStream stream_case_key=new RewriteRuleSubtreeStream(adaptor,"rule case_key");
        RewriteRuleSubtreeStream stream_end_key=new RewriteRuleSubtreeStream(adaptor,"rule end_key");
        try {
            // PLSQL_DMLParser.g:1003:5: ( ( label_name )? ck1= case_key ( searched_case_when_part )+ ( case_else_part )? end_key ( case_key )? ( label_name )? -> ^( SEARCHED_CASE[$ck1.start] ( label_name )* ( searched_case_when_part )+ ( case_else_part )? ) )
            // PLSQL_DMLParser.g:1003:10: ( label_name )? ck1= case_key ( searched_case_when_part )+ ( case_else_part )? end_key ( case_key )? ( label_name )?
            {
            // PLSQL_DMLParser.g:1003:10: ( label_name )?
            int alt219=2;
            int LA219_0 = input.LA(1);

            if ( (LA219_0==DELIMITED_ID||LA219_0==REGULAR_ID) ) {
                alt219=1;
            }
            switch (alt219) {
                case 1 :
                    // PLSQL_DMLParser.g:1003:10: label_name
                    {
                    pushFollow(FOLLOW_label_name_in_searched_case_statement9609);
                    label_name680=gPLSQLParser.label_name();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_label_name.add(label_name680.getTree());

                    }
                    break;

            }


            pushFollow(FOLLOW_case_key_in_searched_case_statement9614);
            ck1=gPLSQLParser.case_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_case_key.add(ck1.getTree());

            // PLSQL_DMLParser.g:1004:9: ( searched_case_when_part )+
            int cnt220=0;
            loop220:
            do {
                int alt220=2;
                int LA220_0 = input.LA(1);

                if ( (LA220_0==SQL92_RESERVED_WHEN) ) {
                    alt220=1;
                }


                switch (alt220) {
            	case 1 :
            	    // PLSQL_DMLParser.g:1004:9: searched_case_when_part
            	    {
            	    pushFollow(FOLLOW_searched_case_when_part_in_searched_case_statement9624);
            	    searched_case_when_part681=searched_case_when_part();

            	    state._fsp--;
            	    if (state.failed) return retval;
            	    if ( state.backtracking==0 ) stream_searched_case_when_part.add(searched_case_when_part681.getTree());

            	    }
            	    break;

            	default :
            	    if ( cnt220 >= 1 ) break loop220;
            	    if (state.backtracking>0) {state.failed=true; return retval;}
                        EarlyExitException eee =
                            new EarlyExitException(220, input);
                        throw eee;
                }
                cnt220++;
            } while (true);


            // PLSQL_DMLParser.g:1005:9: ( case_else_part )?
            int alt221=2;
            int LA221_0 = input.LA(1);

            if ( (LA221_0==SQL92_RESERVED_ELSE) ) {
                alt221=1;
            }
            switch (alt221) {
                case 1 :
                    // PLSQL_DMLParser.g:1005:9: case_else_part
                    {
                    pushFollow(FOLLOW_case_else_part_in_searched_case_statement9635);
                    case_else_part682=case_else_part();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_case_else_part.add(case_else_part682.getTree());

                    }
                    break;

            }


            pushFollow(FOLLOW_end_key_in_searched_case_statement9646);
            end_key683=gPLSQLParser.end_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_end_key.add(end_key683.getTree());

            // PLSQL_DMLParser.g:1006:17: ( case_key )?
            int alt222=2;
            int LA222_0 = input.LA(1);

            if ( (LA222_0==SQL92_RESERVED_CASE) ) {
                alt222=1;
            }
            switch (alt222) {
                case 1 :
                    // PLSQL_DMLParser.g:1006:17: case_key
                    {
                    pushFollow(FOLLOW_case_key_in_searched_case_statement9648);
                    case_key684=gPLSQLParser.case_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_case_key.add(case_key684.getTree());

                    }
                    break;

            }


            // PLSQL_DMLParser.g:1006:27: ( label_name )?
            int alt223=2;
            int LA223_0 = input.LA(1);

            if ( (LA223_0==REGULAR_ID) ) {
                alt223=1;
            }
            else if ( (LA223_0==DELIMITED_ID) ) {
                alt223=1;
            }
            switch (alt223) {
                case 1 :
                    // PLSQL_DMLParser.g:1006:27: label_name
                    {
                    pushFollow(FOLLOW_label_name_in_searched_case_statement9651);
                    label_name685=gPLSQLParser.label_name();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_label_name.add(label_name685.getTree());

                    }
                    break;

            }


            // AST REWRITE
            // elements: label_name, searched_case_when_part, case_else_part
            // token labels: 
            // rule labels: retval
            // token list labels: 
            // rule list labels: 
            // wildcard labels: 
            if ( state.backtracking==0 ) {

            retval.tree = root_0;
            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

            root_0 = (Object)adaptor.nil();
            // 1007:9: -> ^( SEARCHED_CASE[$ck1.start] ( label_name )* ( searched_case_when_part )+ ( case_else_part )? )
            {
                // PLSQL_DMLParser.g:1007:12: ^( SEARCHED_CASE[$ck1.start] ( label_name )* ( searched_case_when_part )+ ( case_else_part )? )
                {
                Object root_1 = (Object)adaptor.nil();
                root_1 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(SEARCHED_CASE, (ck1!=null?((Token)ck1.start):null))
                , root_1);

                // PLSQL_DMLParser.g:1007:40: ( label_name )*
                while ( stream_label_name.hasNext() ) {
                    adaptor.addChild(root_1, stream_label_name.nextTree());

                }
                stream_label_name.reset();

                if ( !(stream_searched_case_when_part.hasNext()) ) {
                    throw new RewriteEarlyExitException();
                }
                while ( stream_searched_case_when_part.hasNext() ) {
                    adaptor.addChild(root_1, stream_searched_case_when_part.nextTree());

                }
                stream_searched_case_when_part.reset();

                // PLSQL_DMLParser.g:1007:77: ( case_else_part )?
                if ( stream_case_else_part.hasNext() ) {
                    adaptor.addChild(root_1, stream_case_else_part.nextTree());

                }
                stream_case_else_part.reset();

                adaptor.addChild(root_0, root_1);
                }

            }


            retval.tree = root_0;
            }

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "searched_case_statement"


    public static class searched_case_when_part_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "searched_case_when_part"
    // PLSQL_DMLParser.g:1010:1: searched_case_when_part : when_key ^ condition_wrapper then_key ! ({...}? seq_of_statements | expression_wrapper ) ;
    public final PLSQLParser_PLSQL_DMLParser.searched_case_when_part_return searched_case_when_part() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.searched_case_when_part_return retval = new PLSQLParser_PLSQL_DMLParser.searched_case_when_part_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        PLSQLParser_PLSQLKeys.when_key_return when_key686 =null;

        PLSQLParser_PLSQL_DMLParser.condition_wrapper_return condition_wrapper687 =null;

        PLSQLParser_PLSQLKeys.then_key_return then_key688 =null;

        PLSQLParser_PLSQL_DMLParser.seq_of_statements_return seq_of_statements689 =null;

        PLSQLParser_PLSQL_DMLParser.expression_wrapper_return expression_wrapper690 =null;



        try {
            // PLSQL_DMLParser.g:1011:5: ( when_key ^ condition_wrapper then_key ! ({...}? seq_of_statements | expression_wrapper ) )
            // PLSQL_DMLParser.g:1011:10: when_key ^ condition_wrapper then_key ! ({...}? seq_of_statements | expression_wrapper )
            {
            root_0 = (Object)adaptor.nil();


            pushFollow(FOLLOW_when_key_in_searched_case_when_part9697);
            when_key686=gPLSQLParser.when_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) root_0 = (Object)adaptor.becomeRoot(when_key686.getTree(), root_0);

            pushFollow(FOLLOW_condition_wrapper_in_searched_case_when_part9700);
            condition_wrapper687=condition_wrapper();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) adaptor.addChild(root_0, condition_wrapper687.getTree());

            pushFollow(FOLLOW_then_key_in_searched_case_when_part9702);
            then_key688=gPLSQLParser.then_key();

            state._fsp--;
            if (state.failed) return retval;

            // PLSQL_DMLParser.g:1011:48: ({...}? seq_of_statements | expression_wrapper )
            int alt224=2;
            switch ( input.LA(1) ) {
            case SQL92_RESERVED_DELETE:
            case SQL92_RESERVED_INSERT:
            case SQL92_RESERVED_SELECT:
            case SQL92_RESERVED_UPDATE:
            case SQL92_RESERVED_WITH:
                {
                alt224=1;
                }
                break;
            case LEFT_PAREN:
                {
                int LA224_3 = input.LA(2);

                if ( ((((case_statement_scope)case_statement_stack.peek()).isStatement)) ) {
                    alt224=1;
                }
                else if ( (true) ) {
                    alt224=2;
                }
                else {
                    if (state.backtracking>0) {state.failed=true; return retval;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 224, 3, input);

                    throw nvae;

                }
                }
                break;
            case REGULAR_ID:
                {
                int LA224_7 = input.LA(2);

                if ( ((((case_statement_scope)case_statement_stack.peek()).isStatement)) ) {
                    alt224=1;
                }
                else if ( (true) ) {
                    alt224=2;
                }
                else {
                    if (state.backtracking>0) {state.failed=true; return retval;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 224, 7, input);

                    throw nvae;

                }
                }
                break;
            case DELIMITED_ID:
                {
                int LA224_8 = input.LA(2);

                if ( ((((case_statement_scope)case_statement_stack.peek()).isStatement)) ) {
                    alt224=1;
                }
                else if ( (true) ) {
                    alt224=2;
                }
                else {
                    if (state.backtracking>0) {state.failed=true; return retval;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 224, 8, input);

                    throw nvae;

                }
                }
                break;
            case SQL92_RESERVED_CASE:
                {
                int LA224_9 = input.LA(2);

                if ( ((((case_statement_scope)case_statement_stack.peek()).isStatement)) ) {
                    alt224=1;
                }
                else if ( (((input.LA(1) == SQL92_RESERVED_CASE || input.LA(2) == SQL92_RESERVED_CASE))) ) {
                    alt224=2;
                }
                else {
                    if (state.backtracking>0) {state.failed=true; return retval;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 224, 9, input);

                    throw nvae;

                }
                }
                break;
            case APPROXIMATE_NUM_LIT:
            case CHAR_STRING:
            case COLON:
            case EXACT_NUM_LIT:
            case INTRODUCER:
            case MINUS_SIGN:
            case PLUS_SIGN:
            case SQL92_RESERVED_ALL:
            case SQL92_RESERVED_ANY:
            case SQL92_RESERVED_DEFAULT:
            case SQL92_RESERVED_DISTINCT:
            case SQL92_RESERVED_EXISTS:
            case SQL92_RESERVED_FALSE:
            case SQL92_RESERVED_NOT:
            case SQL92_RESERVED_NULL:
            case SQL92_RESERVED_PRIOR:
            case SQL92_RESERVED_TRUE:
            case UNSIGNED_INTEGER:
                {
                alt224=2;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return retval;}
                NoViableAltException nvae =
                    new NoViableAltException("", 224, 0, input);

                throw nvae;

            }

            switch (alt224) {
                case 1 :
                    // PLSQL_DMLParser.g:1011:49: {...}? seq_of_statements
                    {
                    if ( !((((case_statement_scope)case_statement_stack.peek()).isStatement)) ) {
                        if (state.backtracking>0) {state.failed=true; return retval;}
                        throw new FailedPredicateException(input, "searched_case_when_part", "$case_statement::isStatement");
                    }

                    pushFollow(FOLLOW_seq_of_statements_in_searched_case_when_part9708);
                    seq_of_statements689=seq_of_statements();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, seq_of_statements689.getTree());

                    }
                    break;
                case 2 :
                    // PLSQL_DMLParser.g:1011:101: expression_wrapper
                    {
                    pushFollow(FOLLOW_expression_wrapper_in_searched_case_when_part9712);
                    expression_wrapper690=expression_wrapper();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, expression_wrapper690.getTree());

                    }
                    break;

            }


            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "searched_case_when_part"


    public static class case_else_part_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "case_else_part"
    // PLSQL_DMLParser.g:1014:1: case_else_part : else_key ^ ({...}? seq_of_statements | expression_wrapper ) ;
    public final PLSQLParser_PLSQL_DMLParser.case_else_part_return case_else_part() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.case_else_part_return retval = new PLSQLParser_PLSQL_DMLParser.case_else_part_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        PLSQLParser_PLSQLKeys.else_key_return else_key691 =null;

        PLSQLParser_PLSQL_DMLParser.seq_of_statements_return seq_of_statements692 =null;

        PLSQLParser_PLSQL_DMLParser.expression_wrapper_return expression_wrapper693 =null;



        try {
            // PLSQL_DMLParser.g:1015:5: ( else_key ^ ({...}? seq_of_statements | expression_wrapper ) )
            // PLSQL_DMLParser.g:1015:10: else_key ^ ({...}? seq_of_statements | expression_wrapper )
            {
            root_0 = (Object)adaptor.nil();


            pushFollow(FOLLOW_else_key_in_case_else_part9733);
            else_key691=gPLSQLParser.else_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) root_0 = (Object)adaptor.becomeRoot(else_key691.getTree(), root_0);

            // PLSQL_DMLParser.g:1015:20: ({...}? seq_of_statements | expression_wrapper )
            int alt225=2;
            switch ( input.LA(1) ) {
            case SQL92_RESERVED_DELETE:
            case SQL92_RESERVED_INSERT:
            case SQL92_RESERVED_SELECT:
            case SQL92_RESERVED_UPDATE:
            case SQL92_RESERVED_WITH:
                {
                alt225=1;
                }
                break;
            case LEFT_PAREN:
                {
                int LA225_3 = input.LA(2);

                if ( ((((case_statement_scope)case_statement_stack.peek()).isStatement)) ) {
                    alt225=1;
                }
                else if ( (true) ) {
                    alt225=2;
                }
                else {
                    if (state.backtracking>0) {state.failed=true; return retval;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 225, 3, input);

                    throw nvae;

                }
                }
                break;
            case REGULAR_ID:
                {
                int LA225_7 = input.LA(2);

                if ( ((((case_statement_scope)case_statement_stack.peek()).isStatement)) ) {
                    alt225=1;
                }
                else if ( (true) ) {
                    alt225=2;
                }
                else {
                    if (state.backtracking>0) {state.failed=true; return retval;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 225, 7, input);

                    throw nvae;

                }
                }
                break;
            case DELIMITED_ID:
                {
                int LA225_8 = input.LA(2);

                if ( ((((case_statement_scope)case_statement_stack.peek()).isStatement)) ) {
                    alt225=1;
                }
                else if ( (true) ) {
                    alt225=2;
                }
                else {
                    if (state.backtracking>0) {state.failed=true; return retval;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 225, 8, input);

                    throw nvae;

                }
                }
                break;
            case SQL92_RESERVED_CASE:
                {
                int LA225_9 = input.LA(2);

                if ( ((((case_statement_scope)case_statement_stack.peek()).isStatement)) ) {
                    alt225=1;
                }
                else if ( (((input.LA(1) == SQL92_RESERVED_CASE || input.LA(2) == SQL92_RESERVED_CASE))) ) {
                    alt225=2;
                }
                else {
                    if (state.backtracking>0) {state.failed=true; return retval;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 225, 9, input);

                    throw nvae;

                }
                }
                break;
            case APPROXIMATE_NUM_LIT:
            case CHAR_STRING:
            case COLON:
            case EXACT_NUM_LIT:
            case INTRODUCER:
            case MINUS_SIGN:
            case PLUS_SIGN:
            case SQL92_RESERVED_ALL:
            case SQL92_RESERVED_ANY:
            case SQL92_RESERVED_DEFAULT:
            case SQL92_RESERVED_DISTINCT:
            case SQL92_RESERVED_EXISTS:
            case SQL92_RESERVED_FALSE:
            case SQL92_RESERVED_NOT:
            case SQL92_RESERVED_NULL:
            case SQL92_RESERVED_PRIOR:
            case SQL92_RESERVED_TRUE:
            case UNSIGNED_INTEGER:
                {
                alt225=2;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return retval;}
                NoViableAltException nvae =
                    new NoViableAltException("", 225, 0, input);

                throw nvae;

            }

            switch (alt225) {
                case 1 :
                    // PLSQL_DMLParser.g:1015:21: {...}? seq_of_statements
                    {
                    if ( !((((case_statement_scope)case_statement_stack.peek()).isStatement)) ) {
                        if (state.backtracking>0) {state.failed=true; return retval;}
                        throw new FailedPredicateException(input, "case_else_part", "$case_statement::isStatement");
                    }

                    pushFollow(FOLLOW_seq_of_statements_in_case_else_part9739);
                    seq_of_statements692=seq_of_statements();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, seq_of_statements692.getTree());

                    }
                    break;
                case 2 :
                    // PLSQL_DMLParser.g:1015:73: expression_wrapper
                    {
                    pushFollow(FOLLOW_expression_wrapper_in_case_else_part9743);
                    expression_wrapper693=expression_wrapper();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, expression_wrapper693.getTree());

                    }
                    break;

            }


            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "case_else_part"


    public static class atom_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "atom"
    // PLSQL_DMLParser.g:1019:1: atom : ( constant | general_element | LEFT_PAREN ! ( ( select_key )=> subquery | expression_or_vector ) RIGHT_PAREN !);
    public final PLSQLParser_PLSQL_DMLParser.atom_return atom() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.atom_return retval = new PLSQLParser_PLSQL_DMLParser.atom_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token LEFT_PAREN696=null;
        Token RIGHT_PAREN699=null;
        PLSQLParser_PLSQLCommons.constant_return constant694 =null;

        PLSQLParser_PLSQLCommons.general_element_return general_element695 =null;

        PLSQLParser_PLSQL_DMLParser.subquery_return subquery697 =null;

        PLSQLParser_PLSQL_DMLParser.expression_or_vector_return expression_or_vector698 =null;


        Object LEFT_PAREN696_tree=null;
        Object RIGHT_PAREN699_tree=null;

        try {
            // PLSQL_DMLParser.g:1020:5: ( constant | general_element | LEFT_PAREN ! ( ( select_key )=> subquery | expression_or_vector ) RIGHT_PAREN !)
            int alt227=3;
            switch ( input.LA(1) ) {
            case APPROXIMATE_NUM_LIT:
            case CHAR_STRING:
            case EXACT_NUM_LIT:
            case SQL92_RESERVED_DEFAULT:
            case SQL92_RESERVED_FALSE:
            case SQL92_RESERVED_NULL:
            case SQL92_RESERVED_TRUE:
            case UNSIGNED_INTEGER:
                {
                alt227=1;
                }
                break;
            case REGULAR_ID:
                {
                int LA227_2 = input.LA(2);

                if ( (((input.LT(1).getText().equalsIgnoreCase("maxvalue"))||(input.LT(1).getText().equalsIgnoreCase("minvalue"))||(input.LT(1).getText().equalsIgnoreCase("sessiontimezone"))||(input.LT(1).getText().equalsIgnoreCase("dbtimezone")))) ) {
                    alt227=1;
                }
                else if ( (true) ) {
                    alt227=2;
                }
                else {
                    if (state.backtracking>0) {state.failed=true; return retval;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 227, 2, input);

                    throw nvae;

                }
                }
                break;
            case COLON:
            case DELIMITED_ID:
            case INTRODUCER:
                {
                alt227=2;
                }
                break;
            case LEFT_PAREN:
                {
                alt227=3;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return retval;}
                NoViableAltException nvae =
                    new NoViableAltException("", 227, 0, input);

                throw nvae;

            }

            switch (alt227) {
                case 1 :
                    // PLSQL_DMLParser.g:1020:10: constant
                    {
                    root_0 = (Object)adaptor.nil();


                    pushFollow(FOLLOW_constant_in_atom9765);
                    constant694=gPLSQLParser.constant();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, constant694.getTree());

                    }
                    break;
                case 2 :
                    // PLSQL_DMLParser.g:1021:10: general_element
                    {
                    root_0 = (Object)adaptor.nil();


                    pushFollow(FOLLOW_general_element_in_atom9776);
                    general_element695=gPLSQLParser.general_element();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, general_element695.getTree());

                    }
                    break;
                case 3 :
                    // PLSQL_DMLParser.g:1022:10: LEFT_PAREN ! ( ( select_key )=> subquery | expression_or_vector ) RIGHT_PAREN !
                    {
                    root_0 = (Object)adaptor.nil();


                    LEFT_PAREN696=(Token)match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_atom9787); if (state.failed) return retval;

                    // PLSQL_DMLParser.g:1022:22: ( ( select_key )=> subquery | expression_or_vector )
                    int alt226=2;
                    int LA226_0 = input.LA(1);

                    if ( (LA226_0==SQL92_RESERVED_SELECT) && (synpred22_PLSQL_DMLParser())) {
                        alt226=1;
                    }
                    else if ( (LA226_0==LEFT_PAREN) ) {
                        int LA226_2 = input.LA(2);

                        if ( (synpred22_PLSQL_DMLParser()) ) {
                            alt226=1;
                        }
                        else if ( (true) ) {
                            alt226=2;
                        }
                        else {
                            if (state.backtracking>0) {state.failed=true; return retval;}
                            NoViableAltException nvae =
                                new NoViableAltException("", 226, 2, input);

                            throw nvae;

                        }
                    }
                    else if ( (LA226_0==APPROXIMATE_NUM_LIT||(LA226_0 >= CHAR_STRING && LA226_0 <= COLON)||LA226_0==DELIMITED_ID||LA226_0==EXACT_NUM_LIT||LA226_0==INTRODUCER||LA226_0==MINUS_SIGN||LA226_0==PLUS_SIGN||LA226_0==REGULAR_ID||LA226_0==SQL92_RESERVED_ALL||LA226_0==SQL92_RESERVED_ANY||LA226_0==SQL92_RESERVED_CASE||LA226_0==SQL92_RESERVED_DEFAULT||LA226_0==SQL92_RESERVED_DISTINCT||(LA226_0 >= SQL92_RESERVED_EXISTS && LA226_0 <= SQL92_RESERVED_FALSE)||(LA226_0 >= SQL92_RESERVED_NOT && LA226_0 <= SQL92_RESERVED_NULL)||LA226_0==SQL92_RESERVED_PRIOR||LA226_0==SQL92_RESERVED_TRUE||LA226_0==UNSIGNED_INTEGER) ) {
                        alt226=2;
                    }
                    else {
                        if (state.backtracking>0) {state.failed=true; return retval;}
                        NoViableAltException nvae =
                            new NoViableAltException("", 226, 0, input);

                        throw nvae;

                    }
                    switch (alt226) {
                        case 1 :
                            // PLSQL_DMLParser.g:1022:23: ( select_key )=> subquery
                            {
                            pushFollow(FOLLOW_subquery_in_atom9796);
                            subquery697=subquery();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) adaptor.addChild(root_0, subquery697.getTree());

                            }
                            break;
                        case 2 :
                            // PLSQL_DMLParser.g:1022:47: expression_or_vector
                            {
                            pushFollow(FOLLOW_expression_or_vector_in_atom9798);
                            expression_or_vector698=expression_or_vector();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) adaptor.addChild(root_0, expression_or_vector698.getTree());

                            }
                            break;

                    }


                    RIGHT_PAREN699=(Token)match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_atom9801); if (state.failed) return retval;

                    }
                    break;

            }
            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "atom"


    public static class expression_or_vector_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "expression_or_vector"
    // PLSQL_DMLParser.g:1025:1: expression_or_vector : expression ( vector_expr )? -> {mode == 1}? ^( VECTOR_EXPR ^( EXPR expression ) vector_expr ) -> expression ;
    public final PLSQLParser_PLSQL_DMLParser.expression_or_vector_return expression_or_vector() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.expression_or_vector_return retval = new PLSQLParser_PLSQL_DMLParser.expression_or_vector_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        PLSQLParser_PLSQL_DMLParser.expression_return expression700 =null;

        PLSQLParser_PLSQL_DMLParser.vector_expr_return vector_expr701 =null;


        RewriteRuleSubtreeStream stream_expression=new RewriteRuleSubtreeStream(adaptor,"rule expression");
        RewriteRuleSubtreeStream stream_vector_expr=new RewriteRuleSubtreeStream(adaptor,"rule vector_expr");
            int mode = 0;    
        try {
            // PLSQL_DMLParser.g:1027:5: ( expression ( vector_expr )? -> {mode == 1}? ^( VECTOR_EXPR ^( EXPR expression ) vector_expr ) -> expression )
            // PLSQL_DMLParser.g:1027:10: expression ( vector_expr )?
            {
            pushFollow(FOLLOW_expression_in_expression_or_vector9830);
            expression700=expression();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_expression.add(expression700.getTree());

            // PLSQL_DMLParser.g:1027:21: ( vector_expr )?
            int alt228=2;
            int LA228_0 = input.LA(1);

            if ( (LA228_0==COMMA) ) {
                alt228=1;
            }
            switch (alt228) {
                case 1 :
                    // PLSQL_DMLParser.g:1027:22: vector_expr
                    {
                    pushFollow(FOLLOW_vector_expr_in_expression_or_vector9833);
                    vector_expr701=vector_expr();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_vector_expr.add(vector_expr701.getTree());

                    if ( state.backtracking==0 ) {mode = 1;}

                    }
                    break;

            }


            // AST REWRITE
            // elements: expression, vector_expr, expression
            // token labels: 
            // rule labels: retval
            // token list labels: 
            // rule list labels: 
            // wildcard labels: 
            if ( state.backtracking==0 ) {

            retval.tree = root_0;
            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

            root_0 = (Object)adaptor.nil();
            // 1028:9: -> {mode == 1}? ^( VECTOR_EXPR ^( EXPR expression ) vector_expr )
            if (mode == 1) {
                // PLSQL_DMLParser.g:1028:25: ^( VECTOR_EXPR ^( EXPR expression ) vector_expr )
                {
                Object root_1 = (Object)adaptor.nil();
                root_1 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(VECTOR_EXPR, "VECTOR_EXPR")
                , root_1);

                // PLSQL_DMLParser.g:1028:39: ^( EXPR expression )
                {
                Object root_2 = (Object)adaptor.nil();
                root_2 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(EXPR, "EXPR")
                , root_2);

                adaptor.addChild(root_2, stream_expression.nextTree());

                adaptor.addChild(root_1, root_2);
                }

                adaptor.addChild(root_1, stream_vector_expr.nextTree());

                adaptor.addChild(root_0, root_1);
                }

            }

            else // 1029:9: -> expression
            {
                adaptor.addChild(root_0, stream_expression.nextTree());

            }


            retval.tree = root_0;
            }

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "expression_or_vector"


    public static class vector_expr_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "vector_expr"
    // PLSQL_DMLParser.g:1032:1: vector_expr : COMMA expression ( COMMA expression )* -> ( ^( EXPR expression ) )+ ;
    public final PLSQLParser_PLSQL_DMLParser.vector_expr_return vector_expr() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.vector_expr_return retval = new PLSQLParser_PLSQL_DMLParser.vector_expr_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token COMMA702=null;
        Token COMMA704=null;
        PLSQLParser_PLSQL_DMLParser.expression_return expression703 =null;

        PLSQLParser_PLSQL_DMLParser.expression_return expression705 =null;


        Object COMMA702_tree=null;
        Object COMMA704_tree=null;
        RewriteRuleTokenStream stream_COMMA=new RewriteRuleTokenStream(adaptor,"token COMMA");
        RewriteRuleSubtreeStream stream_expression=new RewriteRuleSubtreeStream(adaptor,"rule expression");
        try {
            // PLSQL_DMLParser.g:1033:5: ( COMMA expression ( COMMA expression )* -> ( ^( EXPR expression ) )+ )
            // PLSQL_DMLParser.g:1033:10: COMMA expression ( COMMA expression )*
            {
            COMMA702=(Token)match(input,COMMA,FOLLOW_COMMA_in_vector_expr9893); if (state.failed) return retval; 
            if ( state.backtracking==0 ) stream_COMMA.add(COMMA702);


            pushFollow(FOLLOW_expression_in_vector_expr9895);
            expression703=expression();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_expression.add(expression703.getTree());

            // PLSQL_DMLParser.g:1033:27: ( COMMA expression )*
            loop229:
            do {
                int alt229=2;
                int LA229_0 = input.LA(1);

                if ( (LA229_0==COMMA) ) {
                    alt229=1;
                }


                switch (alt229) {
            	case 1 :
            	    // PLSQL_DMLParser.g:1033:28: COMMA expression
            	    {
            	    COMMA704=(Token)match(input,COMMA,FOLLOW_COMMA_in_vector_expr9898); if (state.failed) return retval; 
            	    if ( state.backtracking==0 ) stream_COMMA.add(COMMA704);


            	    pushFollow(FOLLOW_expression_in_vector_expr9900);
            	    expression705=expression();

            	    state._fsp--;
            	    if (state.failed) return retval;
            	    if ( state.backtracking==0 ) stream_expression.add(expression705.getTree());

            	    }
            	    break;

            	default :
            	    break loop229;
                }
            } while (true);


            // AST REWRITE
            // elements: expression
            // token labels: 
            // rule labels: retval
            // token list labels: 
            // rule list labels: 
            // wildcard labels: 
            if ( state.backtracking==0 ) {

            retval.tree = root_0;
            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

            root_0 = (Object)adaptor.nil();
            // 1034:9: -> ( ^( EXPR expression ) )+
            {
                if ( !(stream_expression.hasNext()) ) {
                    throw new RewriteEarlyExitException();
                }
                while ( stream_expression.hasNext() ) {
                    // PLSQL_DMLParser.g:1034:12: ^( EXPR expression )
                    {
                    Object root_1 = (Object)adaptor.nil();
                    root_1 = (Object)adaptor.becomeRoot(
                    (Object)adaptor.create(EXPR, "EXPR")
                    , root_1);

                    adaptor.addChild(root_1, stream_expression.nextTree());

                    adaptor.addChild(root_0, root_1);
                    }

                }
                stream_expression.reset();

            }


            retval.tree = root_0;
            }

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "vector_expr"


    public static class quantified_expression_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "quantified_expression"
    // PLSQL_DMLParser.g:1037:1: quantified_expression : ( some_key ^| exists_key ^| all_key ^| any_key ^) LEFT_PAREN ! expression_wrapper RIGHT_PAREN !;
    public final PLSQLParser_PLSQL_DMLParser.quantified_expression_return quantified_expression() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.quantified_expression_return retval = new PLSQLParser_PLSQL_DMLParser.quantified_expression_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token LEFT_PAREN710=null;
        Token RIGHT_PAREN712=null;
        PLSQLParser_PLSQLKeys.some_key_return some_key706 =null;

        PLSQLParser_PLSQLKeys.exists_key_return exists_key707 =null;

        PLSQLParser_PLSQLKeys.all_key_return all_key708 =null;

        PLSQLParser_PLSQLKeys.any_key_return any_key709 =null;

        PLSQLParser_PLSQL_DMLParser.expression_wrapper_return expression_wrapper711 =null;


        Object LEFT_PAREN710_tree=null;
        Object RIGHT_PAREN712_tree=null;

        try {
            // PLSQL_DMLParser.g:1038:5: ( ( some_key ^| exists_key ^| all_key ^| any_key ^) LEFT_PAREN ! expression_wrapper RIGHT_PAREN !)
            // PLSQL_DMLParser.g:1038:10: ( some_key ^| exists_key ^| all_key ^| any_key ^) LEFT_PAREN ! expression_wrapper RIGHT_PAREN !
            {
            root_0 = (Object)adaptor.nil();


            // PLSQL_DMLParser.g:1038:10: ( some_key ^| exists_key ^| all_key ^| any_key ^)
            int alt230=4;
            switch ( input.LA(1) ) {
            case REGULAR_ID:
                {
                alt230=1;
                }
                break;
            case SQL92_RESERVED_EXISTS:
                {
                alt230=2;
                }
                break;
            case SQL92_RESERVED_ALL:
                {
                alt230=3;
                }
                break;
            case SQL92_RESERVED_ANY:
                {
                alt230=4;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return retval;}
                NoViableAltException nvae =
                    new NoViableAltException("", 230, 0, input);

                throw nvae;

            }

            switch (alt230) {
                case 1 :
                    // PLSQL_DMLParser.g:1038:12: some_key ^
                    {
                    pushFollow(FOLLOW_some_key_in_quantified_expression9941);
                    some_key706=gPLSQLParser.some_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) root_0 = (Object)adaptor.becomeRoot(some_key706.getTree(), root_0);

                    }
                    break;
                case 2 :
                    // PLSQL_DMLParser.g:1038:24: exists_key ^
                    {
                    pushFollow(FOLLOW_exists_key_in_quantified_expression9946);
                    exists_key707=gPLSQLParser.exists_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) root_0 = (Object)adaptor.becomeRoot(exists_key707.getTree(), root_0);

                    }
                    break;
                case 3 :
                    // PLSQL_DMLParser.g:1038:38: all_key ^
                    {
                    pushFollow(FOLLOW_all_key_in_quantified_expression9951);
                    all_key708=gPLSQLParser.all_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) root_0 = (Object)adaptor.becomeRoot(all_key708.getTree(), root_0);

                    }
                    break;
                case 4 :
                    // PLSQL_DMLParser.g:1038:49: any_key ^
                    {
                    pushFollow(FOLLOW_any_key_in_quantified_expression9956);
                    any_key709=gPLSQLParser.any_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) root_0 = (Object)adaptor.becomeRoot(any_key709.getTree(), root_0);

                    }
                    break;

            }


            LEFT_PAREN710=(Token)match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_quantified_expression9970); if (state.failed) return retval;

            pushFollow(FOLLOW_expression_wrapper_in_quantified_expression9973);
            expression_wrapper711=expression_wrapper();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) adaptor.addChild(root_0, expression_wrapper711.getTree());

            RIGHT_PAREN712=(Token)match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_quantified_expression9975); if (state.failed) return retval;

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "quantified_expression"


    public static class standard_function_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "standard_function"
    // PLSQL_DMLParser.g:1042:1: standard_function : ( stantard_function_enabling_over ^ function_argument ( over_clause )? | stantard_function_enabling_using ^ function_argument ( using_clause )? | count_key ^ LEFT_PAREN ! ( ASTERISK | concatenation_wrapper ) RIGHT_PAREN ! ( over_clause )? | ( cast_key ^| xmlcast_key ^) LEFT_PAREN ! ( multiset_key ! LEFT_PAREN ! subquery RIGHT_PAREN | concatenation_wrapper ) as_key ! type_spec RIGHT_PAREN !| chr_key ^ LEFT_PAREN ! concatenation_wrapper using_key ! nchar_cs_key RIGHT_PAREN !| collect_key ^ LEFT_PAREN ! ( distinct_key | unique_key )? column_name ( collect_order_by_part )? RIGHT_PAREN !| stantard_function_enabling_within_or_over ^ function_argument ( within_or_over_part )+ | decompose_key ^ LEFT_PAREN ! concatenation_wrapper ( canonical_key | compatibility_key )? RIGHT_PAREN !| extract_key ^ LEFT_PAREN ! REGULAR_ID from_key ! concatenation_wrapper RIGHT_PAREN !| ( first_value_key ^| last_value_key ^) LEFT_PAREN ! concatenation_wrapper ( ignore_key ! nulls_key )? RIGHT_PAREN ! over_clause | stantard_function_pedictions ^ LEFT_PAREN ! expression_wrapper ( COMMA expression_wrapper )* ( cost_matrix_clause )? ( using_clause )? RIGHT_PAREN !| translate_key ^ LEFT_PAREN ! expression_wrapper ( using_key ! ( char_cs_key | nchar_cs_key ) )? ( COMMA expression_wrapper )* RIGHT_PAREN !| treat_key ^ LEFT_PAREN ! expression_wrapper as_key ! ( ref_key )? type_spec RIGHT_PAREN !| trim_key ^ LEFT_PAREN ! ( ( leading_key | trailing_key | both_key )? concatenation_wrapper from_key !)? concatenation_wrapper RIGHT_PAREN !| xmlagg_key ^ LEFT_PAREN ! expression_wrapper ( order_by_clause )? RIGHT_PAREN !| ( xmlcolattval_key ^| xmlforest_key ^) LEFT_PAREN ! xml_multiuse_expression_element ( COMMA ! xml_multiuse_expression_element )* RIGHT_PAREN !| xmlelement_key ^ LEFT_PAREN ! ( entityescaping_key | noentityescaping_key )? ( name_key | evalname_key )? expression_wrapper ({...}? COMMA ! xml_attributes_clause )? ( COMMA ! expression_wrapper ( alias )? )* RIGHT_PAREN !| xmlexists_key ^ LEFT_PAREN ! expression_wrapper ( xml_passing_clause )? RIGHT_PAREN !| xmlparse_key ^ LEFT_PAREN ! ( document_key | content_key ) concatenation_wrapper ( wellformed_key )? RIGHT_PAREN !| xmlpi_key ^ LEFT_PAREN ! ( name_key id | evalname_key concatenation_wrapper ) ( COMMA ! concatenation_wrapper )? RIGHT_PAREN !| xmlquery_key ^ LEFT_PAREN ! concatenation_wrapper ( xml_passing_clause )? returning_key ! content_key ! ( null_key on_key ! empty_key !)? RIGHT_PAREN !| xmlroot_key ^ LEFT_PAREN ! concatenation_wrapper xmlroot_param_version_part ( COMMA ! xmlroot_param_standalone_part )? RIGHT_PAREN !| xmlserialize_key ^ LEFT_PAREN ! ( document_key | content_key ) concatenation_wrapper ( as_key ! type_spec )? ( xmlserialize_param_enconding_part )? ( xmlserialize_param_version_part )? ( xmlserialize_param_ident_part )? ( ( hide_key | show_key ) defaults_key )? RIGHT_PAREN !| xmltable_key ^ LEFT_PAREN ! ( xml_namespaces_clause )? concatenation_wrapper ( xml_passing_clause )? ( columns_key ! xml_table_column ( COMMA ! xml_table_column ) )? RIGHT_PAREN !);
    public final PLSQLParser_PLSQL_DMLParser.standard_function_return standard_function() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.standard_function_return retval = new PLSQLParser_PLSQL_DMLParser.standard_function_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token LEFT_PAREN720=null;
        Token ASTERISK721=null;
        Token RIGHT_PAREN723=null;
        Token LEFT_PAREN727=null;
        Token LEFT_PAREN729=null;
        Token RIGHT_PAREN731=null;
        Token RIGHT_PAREN735=null;
        Token LEFT_PAREN737=null;
        Token RIGHT_PAREN741=null;
        Token LEFT_PAREN743=null;
        Token RIGHT_PAREN748=null;
        Token LEFT_PAREN753=null;
        Token RIGHT_PAREN757=null;
        Token LEFT_PAREN759=null;
        Token REGULAR_ID760=null;
        Token RIGHT_PAREN763=null;
        Token LEFT_PAREN766=null;
        Token RIGHT_PAREN770=null;
        Token LEFT_PAREN773=null;
        Token COMMA775=null;
        Token RIGHT_PAREN779=null;
        Token LEFT_PAREN781=null;
        Token COMMA786=null;
        Token RIGHT_PAREN788=null;
        Token LEFT_PAREN790=null;
        Token RIGHT_PAREN795=null;
        Token LEFT_PAREN797=null;
        Token RIGHT_PAREN804=null;
        Token LEFT_PAREN806=null;
        Token RIGHT_PAREN809=null;
        Token LEFT_PAREN812=null;
        Token COMMA814=null;
        Token RIGHT_PAREN816=null;
        Token LEFT_PAREN818=null;
        Token COMMA824=null;
        Token COMMA826=null;
        Token RIGHT_PAREN829=null;
        Token LEFT_PAREN831=null;
        Token RIGHT_PAREN834=null;
        Token LEFT_PAREN836=null;
        Token RIGHT_PAREN841=null;
        Token LEFT_PAREN843=null;
        Token COMMA848=null;
        Token RIGHT_PAREN850=null;
        Token LEFT_PAREN852=null;
        Token RIGHT_PAREN860=null;
        Token LEFT_PAREN862=null;
        Token COMMA865=null;
        Token RIGHT_PAREN867=null;
        Token LEFT_PAREN869=null;
        Token RIGHT_PAREN881=null;
        Token LEFT_PAREN883=null;
        Token COMMA889=null;
        Token RIGHT_PAREN891=null;
        PLSQLParser_PLSQL_DMLParser.stantard_function_enabling_over_return stantard_function_enabling_over713 =null;

        PLSQLParser_PLSQLCommons.function_argument_return function_argument714 =null;

        PLSQLParser_PLSQL_DMLParser.over_clause_return over_clause715 =null;

        PLSQLParser_PLSQL_DMLParser.stantard_function_enabling_using_return stantard_function_enabling_using716 =null;

        PLSQLParser_PLSQLCommons.function_argument_return function_argument717 =null;

        PLSQLParser_PLSQL_DMLParser.using_clause_return using_clause718 =null;

        PLSQLParser_PLSQLKeys.count_key_return count_key719 =null;

        PLSQLParser_PLSQL_DMLParser.concatenation_wrapper_return concatenation_wrapper722 =null;

        PLSQLParser_PLSQL_DMLParser.over_clause_return over_clause724 =null;

        PLSQLParser_PLSQLKeys.cast_key_return cast_key725 =null;

        PLSQLParser_PLSQLKeys.xmlcast_key_return xmlcast_key726 =null;

        PLSQLParser_PLSQLKeys.multiset_key_return multiset_key728 =null;

        PLSQLParser_PLSQL_DMLParser.subquery_return subquery730 =null;

        PLSQLParser_PLSQL_DMLParser.concatenation_wrapper_return concatenation_wrapper732 =null;

        PLSQLParser_PLSQLKeys.as_key_return as_key733 =null;

        PLSQLParser_PLSQLCommons.type_spec_return type_spec734 =null;

        PLSQLParser_PLSQLKeys.chr_key_return chr_key736 =null;

        PLSQLParser_PLSQL_DMLParser.concatenation_wrapper_return concatenation_wrapper738 =null;

        PLSQLParser_PLSQLKeys.using_key_return using_key739 =null;

        PLSQLParser_PLSQLKeys.nchar_cs_key_return nchar_cs_key740 =null;

        PLSQLParser_PLSQLKeys.collect_key_return collect_key742 =null;

        PLSQLParser_PLSQLKeys.distinct_key_return distinct_key744 =null;

        PLSQLParser_PLSQLKeys.unique_key_return unique_key745 =null;

        PLSQLParser_PLSQLCommons.column_name_return column_name746 =null;

        PLSQLParser_PLSQL_DMLParser.collect_order_by_part_return collect_order_by_part747 =null;

        PLSQLParser_PLSQL_DMLParser.stantard_function_enabling_within_or_over_return stantard_function_enabling_within_or_over749 =null;

        PLSQLParser_PLSQLCommons.function_argument_return function_argument750 =null;

        PLSQLParser_PLSQL_DMLParser.within_or_over_part_return within_or_over_part751 =null;

        PLSQLParser_PLSQLKeys.decompose_key_return decompose_key752 =null;

        PLSQLParser_PLSQL_DMLParser.concatenation_wrapper_return concatenation_wrapper754 =null;

        PLSQLParser_PLSQLKeys.canonical_key_return canonical_key755 =null;

        PLSQLParser_PLSQLKeys.compatibility_key_return compatibility_key756 =null;

        PLSQLParser_PLSQLKeys.extract_key_return extract_key758 =null;

        PLSQLParser_PLSQLKeys.from_key_return from_key761 =null;

        PLSQLParser_PLSQL_DMLParser.concatenation_wrapper_return concatenation_wrapper762 =null;

        PLSQLParser_PLSQLKeys.first_value_key_return first_value_key764 =null;

        PLSQLParser_PLSQLKeys.last_value_key_return last_value_key765 =null;

        PLSQLParser_PLSQL_DMLParser.concatenation_wrapper_return concatenation_wrapper767 =null;

        PLSQLParser_PLSQLKeys.ignore_key_return ignore_key768 =null;

        PLSQLParser_PLSQLKeys.nulls_key_return nulls_key769 =null;

        PLSQLParser_PLSQL_DMLParser.over_clause_return over_clause771 =null;

        PLSQLParser_PLSQL_DMLParser.stantard_function_pedictions_return stantard_function_pedictions772 =null;

        PLSQLParser_PLSQL_DMLParser.expression_wrapper_return expression_wrapper774 =null;

        PLSQLParser_PLSQL_DMLParser.expression_wrapper_return expression_wrapper776 =null;

        PLSQLParser_PLSQL_DMLParser.cost_matrix_clause_return cost_matrix_clause777 =null;

        PLSQLParser_PLSQL_DMLParser.using_clause_return using_clause778 =null;

        PLSQLParser_PLSQLKeys.translate_key_return translate_key780 =null;

        PLSQLParser_PLSQL_DMLParser.expression_wrapper_return expression_wrapper782 =null;

        PLSQLParser_PLSQLKeys.using_key_return using_key783 =null;

        PLSQLParser_PLSQLKeys.char_cs_key_return char_cs_key784 =null;

        PLSQLParser_PLSQLKeys.nchar_cs_key_return nchar_cs_key785 =null;

        PLSQLParser_PLSQL_DMLParser.expression_wrapper_return expression_wrapper787 =null;

        PLSQLParser_PLSQLKeys.treat_key_return treat_key789 =null;

        PLSQLParser_PLSQL_DMLParser.expression_wrapper_return expression_wrapper791 =null;

        PLSQLParser_PLSQLKeys.as_key_return as_key792 =null;

        PLSQLParser_PLSQLKeys.ref_key_return ref_key793 =null;

        PLSQLParser_PLSQLCommons.type_spec_return type_spec794 =null;

        PLSQLParser_PLSQLKeys.trim_key_return trim_key796 =null;

        PLSQLParser_PLSQLKeys.leading_key_return leading_key798 =null;

        PLSQLParser_PLSQLKeys.trailing_key_return trailing_key799 =null;

        PLSQLParser_PLSQLKeys.both_key_return both_key800 =null;

        PLSQLParser_PLSQL_DMLParser.concatenation_wrapper_return concatenation_wrapper801 =null;

        PLSQLParser_PLSQLKeys.from_key_return from_key802 =null;

        PLSQLParser_PLSQL_DMLParser.concatenation_wrapper_return concatenation_wrapper803 =null;

        PLSQLParser_PLSQLKeys.xmlagg_key_return xmlagg_key805 =null;

        PLSQLParser_PLSQL_DMLParser.expression_wrapper_return expression_wrapper807 =null;

        PLSQLParser_PLSQL_DMLParser.order_by_clause_return order_by_clause808 =null;

        PLSQLParser_PLSQLKeys.xmlcolattval_key_return xmlcolattval_key810 =null;

        PLSQLParser_PLSQLKeys.xmlforest_key_return xmlforest_key811 =null;

        PLSQLParser_PLSQL_DMLParser.xml_multiuse_expression_element_return xml_multiuse_expression_element813 =null;

        PLSQLParser_PLSQL_DMLParser.xml_multiuse_expression_element_return xml_multiuse_expression_element815 =null;

        PLSQLParser_PLSQLKeys.xmlelement_key_return xmlelement_key817 =null;

        PLSQLParser_PLSQLKeys.entityescaping_key_return entityescaping_key819 =null;

        PLSQLParser_PLSQLKeys.noentityescaping_key_return noentityescaping_key820 =null;

        PLSQLParser_PLSQLKeys.name_key_return name_key821 =null;

        PLSQLParser_PLSQLKeys.evalname_key_return evalname_key822 =null;

        PLSQLParser_PLSQL_DMLParser.expression_wrapper_return expression_wrapper823 =null;

        PLSQLParser_PLSQL_DMLParser.xml_attributes_clause_return xml_attributes_clause825 =null;

        PLSQLParser_PLSQL_DMLParser.expression_wrapper_return expression_wrapper827 =null;

        PLSQLParser_PLSQLCommons.alias_return alias828 =null;

        PLSQLParser_PLSQLKeys.xmlexists_key_return xmlexists_key830 =null;

        PLSQLParser_PLSQL_DMLParser.expression_wrapper_return expression_wrapper832 =null;

        PLSQLParser_PLSQL_DMLParser.xml_passing_clause_return xml_passing_clause833 =null;

        PLSQLParser_PLSQLKeys.xmlparse_key_return xmlparse_key835 =null;

        PLSQLParser_PLSQLKeys.document_key_return document_key837 =null;

        PLSQLParser_PLSQLKeys.content_key_return content_key838 =null;

        PLSQLParser_PLSQL_DMLParser.concatenation_wrapper_return concatenation_wrapper839 =null;

        PLSQLParser_PLSQLKeys.wellformed_key_return wellformed_key840 =null;

        PLSQLParser_PLSQLKeys.xmlpi_key_return xmlpi_key842 =null;

        PLSQLParser_PLSQLKeys.name_key_return name_key844 =null;

        PLSQLParser_PLSQLCommons.id_return id845 =null;

        PLSQLParser_PLSQLKeys.evalname_key_return evalname_key846 =null;

        PLSQLParser_PLSQL_DMLParser.concatenation_wrapper_return concatenation_wrapper847 =null;

        PLSQLParser_PLSQL_DMLParser.concatenation_wrapper_return concatenation_wrapper849 =null;

        PLSQLParser_PLSQLKeys.xmlquery_key_return xmlquery_key851 =null;

        PLSQLParser_PLSQL_DMLParser.concatenation_wrapper_return concatenation_wrapper853 =null;

        PLSQLParser_PLSQL_DMLParser.xml_passing_clause_return xml_passing_clause854 =null;

        PLSQLParser_PLSQLKeys.returning_key_return returning_key855 =null;

        PLSQLParser_PLSQLKeys.content_key_return content_key856 =null;

        PLSQLParser_PLSQLKeys.null_key_return null_key857 =null;

        PLSQLParser_PLSQLKeys.on_key_return on_key858 =null;

        PLSQLParser_PLSQLKeys.empty_key_return empty_key859 =null;

        PLSQLParser_PLSQLKeys.xmlroot_key_return xmlroot_key861 =null;

        PLSQLParser_PLSQL_DMLParser.concatenation_wrapper_return concatenation_wrapper863 =null;

        PLSQLParser_PLSQL_DMLParser.xmlroot_param_version_part_return xmlroot_param_version_part864 =null;

        PLSQLParser_PLSQL_DMLParser.xmlroot_param_standalone_part_return xmlroot_param_standalone_part866 =null;

        PLSQLParser_PLSQLKeys.xmlserialize_key_return xmlserialize_key868 =null;

        PLSQLParser_PLSQLKeys.document_key_return document_key870 =null;

        PLSQLParser_PLSQLKeys.content_key_return content_key871 =null;

        PLSQLParser_PLSQL_DMLParser.concatenation_wrapper_return concatenation_wrapper872 =null;

        PLSQLParser_PLSQLKeys.as_key_return as_key873 =null;

        PLSQLParser_PLSQLCommons.type_spec_return type_spec874 =null;

        PLSQLParser_PLSQL_DMLParser.xmlserialize_param_enconding_part_return xmlserialize_param_enconding_part875 =null;

        PLSQLParser_PLSQL_DMLParser.xmlserialize_param_version_part_return xmlserialize_param_version_part876 =null;

        PLSQLParser_PLSQL_DMLParser.xmlserialize_param_ident_part_return xmlserialize_param_ident_part877 =null;

        PLSQLParser_PLSQLKeys.hide_key_return hide_key878 =null;

        PLSQLParser_PLSQLKeys.show_key_return show_key879 =null;

        PLSQLParser_PLSQLKeys.defaults_key_return defaults_key880 =null;

        PLSQLParser_PLSQLKeys.xmltable_key_return xmltable_key882 =null;

        PLSQLParser_PLSQL_DMLParser.xml_namespaces_clause_return xml_namespaces_clause884 =null;

        PLSQLParser_PLSQL_DMLParser.concatenation_wrapper_return concatenation_wrapper885 =null;

        PLSQLParser_PLSQL_DMLParser.xml_passing_clause_return xml_passing_clause886 =null;

        PLSQLParser_PLSQLKeys.columns_key_return columns_key887 =null;

        PLSQLParser_PLSQL_DMLParser.xml_table_column_return xml_table_column888 =null;

        PLSQLParser_PLSQL_DMLParser.xml_table_column_return xml_table_column890 =null;


        Object LEFT_PAREN720_tree=null;
        Object ASTERISK721_tree=null;
        Object RIGHT_PAREN723_tree=null;
        Object LEFT_PAREN727_tree=null;
        Object LEFT_PAREN729_tree=null;
        Object RIGHT_PAREN731_tree=null;
        Object RIGHT_PAREN735_tree=null;
        Object LEFT_PAREN737_tree=null;
        Object RIGHT_PAREN741_tree=null;
        Object LEFT_PAREN743_tree=null;
        Object RIGHT_PAREN748_tree=null;
        Object LEFT_PAREN753_tree=null;
        Object RIGHT_PAREN757_tree=null;
        Object LEFT_PAREN759_tree=null;
        Object REGULAR_ID760_tree=null;
        Object RIGHT_PAREN763_tree=null;
        Object LEFT_PAREN766_tree=null;
        Object RIGHT_PAREN770_tree=null;
        Object LEFT_PAREN773_tree=null;
        Object COMMA775_tree=null;
        Object RIGHT_PAREN779_tree=null;
        Object LEFT_PAREN781_tree=null;
        Object COMMA786_tree=null;
        Object RIGHT_PAREN788_tree=null;
        Object LEFT_PAREN790_tree=null;
        Object RIGHT_PAREN795_tree=null;
        Object LEFT_PAREN797_tree=null;
        Object RIGHT_PAREN804_tree=null;
        Object LEFT_PAREN806_tree=null;
        Object RIGHT_PAREN809_tree=null;
        Object LEFT_PAREN812_tree=null;
        Object COMMA814_tree=null;
        Object RIGHT_PAREN816_tree=null;
        Object LEFT_PAREN818_tree=null;
        Object COMMA824_tree=null;
        Object COMMA826_tree=null;
        Object RIGHT_PAREN829_tree=null;
        Object LEFT_PAREN831_tree=null;
        Object RIGHT_PAREN834_tree=null;
        Object LEFT_PAREN836_tree=null;
        Object RIGHT_PAREN841_tree=null;
        Object LEFT_PAREN843_tree=null;
        Object COMMA848_tree=null;
        Object RIGHT_PAREN850_tree=null;
        Object LEFT_PAREN852_tree=null;
        Object RIGHT_PAREN860_tree=null;
        Object LEFT_PAREN862_tree=null;
        Object COMMA865_tree=null;
        Object RIGHT_PAREN867_tree=null;
        Object LEFT_PAREN869_tree=null;
        Object RIGHT_PAREN881_tree=null;
        Object LEFT_PAREN883_tree=null;
        Object COMMA889_tree=null;
        Object RIGHT_PAREN891_tree=null;

        try {
            // PLSQL_DMLParser.g:1043:5: ( stantard_function_enabling_over ^ function_argument ( over_clause )? | stantard_function_enabling_using ^ function_argument ( using_clause )? | count_key ^ LEFT_PAREN ! ( ASTERISK | concatenation_wrapper ) RIGHT_PAREN ! ( over_clause )? | ( cast_key ^| xmlcast_key ^) LEFT_PAREN ! ( multiset_key ! LEFT_PAREN ! subquery RIGHT_PAREN | concatenation_wrapper ) as_key ! type_spec RIGHT_PAREN !| chr_key ^ LEFT_PAREN ! concatenation_wrapper using_key ! nchar_cs_key RIGHT_PAREN !| collect_key ^ LEFT_PAREN ! ( distinct_key | unique_key )? column_name ( collect_order_by_part )? RIGHT_PAREN !| stantard_function_enabling_within_or_over ^ function_argument ( within_or_over_part )+ | decompose_key ^ LEFT_PAREN ! concatenation_wrapper ( canonical_key | compatibility_key )? RIGHT_PAREN !| extract_key ^ LEFT_PAREN ! REGULAR_ID from_key ! concatenation_wrapper RIGHT_PAREN !| ( first_value_key ^| last_value_key ^) LEFT_PAREN ! concatenation_wrapper ( ignore_key ! nulls_key )? RIGHT_PAREN ! over_clause | stantard_function_pedictions ^ LEFT_PAREN ! expression_wrapper ( COMMA expression_wrapper )* ( cost_matrix_clause )? ( using_clause )? RIGHT_PAREN !| translate_key ^ LEFT_PAREN ! expression_wrapper ( using_key ! ( char_cs_key | nchar_cs_key ) )? ( COMMA expression_wrapper )* RIGHT_PAREN !| treat_key ^ LEFT_PAREN ! expression_wrapper as_key ! ( ref_key )? type_spec RIGHT_PAREN !| trim_key ^ LEFT_PAREN ! ( ( leading_key | trailing_key | both_key )? concatenation_wrapper from_key !)? concatenation_wrapper RIGHT_PAREN !| xmlagg_key ^ LEFT_PAREN ! expression_wrapper ( order_by_clause )? RIGHT_PAREN !| ( xmlcolattval_key ^| xmlforest_key ^) LEFT_PAREN ! xml_multiuse_expression_element ( COMMA ! xml_multiuse_expression_element )* RIGHT_PAREN !| xmlelement_key ^ LEFT_PAREN ! ( entityescaping_key | noentityescaping_key )? ( name_key | evalname_key )? expression_wrapper ({...}? COMMA ! xml_attributes_clause )? ( COMMA ! expression_wrapper ( alias )? )* RIGHT_PAREN !| xmlexists_key ^ LEFT_PAREN ! expression_wrapper ( xml_passing_clause )? RIGHT_PAREN !| xmlparse_key ^ LEFT_PAREN ! ( document_key | content_key ) concatenation_wrapper ( wellformed_key )? RIGHT_PAREN !| xmlpi_key ^ LEFT_PAREN ! ( name_key id | evalname_key concatenation_wrapper ) ( COMMA ! concatenation_wrapper )? RIGHT_PAREN !| xmlquery_key ^ LEFT_PAREN ! concatenation_wrapper ( xml_passing_clause )? returning_key ! content_key ! ( null_key on_key ! empty_key !)? RIGHT_PAREN !| xmlroot_key ^ LEFT_PAREN ! concatenation_wrapper xmlroot_param_version_part ( COMMA ! xmlroot_param_standalone_part )? RIGHT_PAREN !| xmlserialize_key ^ LEFT_PAREN ! ( document_key | content_key ) concatenation_wrapper ( as_key ! type_spec )? ( xmlserialize_param_enconding_part )? ( xmlserialize_param_version_part )? ( xmlserialize_param_ident_part )? ( ( hide_key | show_key ) defaults_key )? RIGHT_PAREN !| xmltable_key ^ LEFT_PAREN ! ( xml_namespaces_clause )? concatenation_wrapper ( xml_passing_clause )? ( columns_key ! xml_table_column ( COMMA ! xml_table_column ) )? RIGHT_PAREN !)
            int alt278=24;
            int LA278_0 = input.LA(1);

            if ( (LA278_0==REGULAR_ID) ) {
                int LA278_1 = input.LA(2);

                if ( ((enablesOverClause(input.LT(1).getText()))) ) {
                    alt278=1;
                }
                else if ( ((enablesUsingClause(input.LT(1).getText()))) ) {
                    alt278=2;
                }
                else if ( ((input.LT(1).getText().equalsIgnoreCase("count"))) ) {
                    alt278=3;
                }
                else if ( (((input.LT(1).getText().equalsIgnoreCase("cast"))||(input.LT(1).getText().equalsIgnoreCase("xmlcast")))) ) {
                    alt278=4;
                }
                else if ( ((input.LT(1).getText().equalsIgnoreCase("chr"))) ) {
                    alt278=5;
                }
                else if ( ((input.LT(1).getText().equalsIgnoreCase("collect"))) ) {
                    alt278=6;
                }
                else if ( ((enablesWithinOrOverClause(input.LT(1).getText()))) ) {
                    alt278=7;
                }
                else if ( ((input.LT(1).getText().equalsIgnoreCase("decompose"))) ) {
                    alt278=8;
                }
                else if ( ((input.LT(1).getText().equalsIgnoreCase("extract"))) ) {
                    alt278=9;
                }
                else if ( (((input.LT(1).getText().equalsIgnoreCase("first_value"))||(input.LT(1).getText().equalsIgnoreCase("last_value")))) ) {
                    alt278=10;
                }
                else if ( ((isStandardPredictionFunction(input.LT(1).getText()))) ) {
                    alt278=11;
                }
                else if ( ((input.LT(1).getText().equalsIgnoreCase("translate"))) ) {
                    alt278=12;
                }
                else if ( ((input.LT(1).getText().equalsIgnoreCase("treat"))) ) {
                    alt278=13;
                }
                else if ( ((input.LT(1).getText().equalsIgnoreCase("trim"))) ) {
                    alt278=14;
                }
                else if ( ((input.LT(1).getText().equalsIgnoreCase("xmlagg"))) ) {
                    alt278=15;
                }
                else if ( (((input.LT(1).getText().equalsIgnoreCase("xmlcolattval"))||(input.LT(1).getText().equalsIgnoreCase("xmlforest")))) ) {
                    alt278=16;
                }
                else if ( ((input.LT(1).getText().equalsIgnoreCase("xmlelement"))) ) {
                    alt278=17;
                }
                else if ( ((input.LT(1).getText().equalsIgnoreCase("xmlexists"))) ) {
                    alt278=18;
                }
                else if ( ((input.LT(1).getText().equalsIgnoreCase("xmlparse"))) ) {
                    alt278=19;
                }
                else if ( ((input.LT(1).getText().equalsIgnoreCase("xmlpi"))) ) {
                    alt278=20;
                }
                else if ( ((input.LT(1).getText().equalsIgnoreCase("xmlquery"))) ) {
                    alt278=21;
                }
                else if ( ((input.LT(1).getText().equalsIgnoreCase("xmlroot"))) ) {
                    alt278=22;
                }
                else if ( ((input.LT(1).getText().equalsIgnoreCase("xmlserialize"))) ) {
                    alt278=23;
                }
                else if ( ((input.LT(1).getText().equalsIgnoreCase("xmltable"))) ) {
                    alt278=24;
                }
                else {
                    if (state.backtracking>0) {state.failed=true; return retval;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 278, 1, input);

                    throw nvae;

                }
            }
            else {
                if (state.backtracking>0) {state.failed=true; return retval;}
                NoViableAltException nvae =
                    new NoViableAltException("", 278, 0, input);

                throw nvae;

            }
            switch (alt278) {
                case 1 :
                    // PLSQL_DMLParser.g:1043:10: stantard_function_enabling_over ^ function_argument ( over_clause )?
                    {
                    root_0 = (Object)adaptor.nil();


                    pushFollow(FOLLOW_stantard_function_enabling_over_in_standard_function9996);
                    stantard_function_enabling_over713=stantard_function_enabling_over();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) root_0 = (Object)adaptor.becomeRoot(stantard_function_enabling_over713.getTree(), root_0);

                    pushFollow(FOLLOW_function_argument_in_standard_function9999);
                    function_argument714=gPLSQLParser.function_argument();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, function_argument714.getTree());

                    // PLSQL_DMLParser.g:1043:61: ( over_clause )?
                    int alt231=2;
                    int LA231_0 = input.LA(1);

                    if ( (LA231_0==REGULAR_ID) ) {
                        int LA231_1 = input.LA(2);

                        if ( (LA231_1==LEFT_PAREN) ) {
                            int LA231_3 = input.LA(3);

                            if ( (LA231_3==REGULAR_ID) ) {
                                int LA231_10 = input.LA(4);

                                if ( (LA231_10==SQL92_RESERVED_BY) && ((input.LT(1).getText().equalsIgnoreCase("over")))) {
                                    alt231=1;
                                }
                            }
                            else if ( (LA231_3==RIGHT_PAREN||LA231_3==SQL92_RESERVED_ORDER) && ((input.LT(1).getText().equalsIgnoreCase("over")))) {
                                alt231=1;
                            }
                        }
                    }
                    switch (alt231) {
                        case 1 :
                            // PLSQL_DMLParser.g:1043:61: over_clause
                            {
                            pushFollow(FOLLOW_over_clause_in_standard_function10001);
                            over_clause715=over_clause();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) adaptor.addChild(root_0, over_clause715.getTree());

                            }
                            break;

                    }


                    }
                    break;
                case 2 :
                    // PLSQL_DMLParser.g:1044:10: stantard_function_enabling_using ^ function_argument ( using_clause )?
                    {
                    root_0 = (Object)adaptor.nil();


                    pushFollow(FOLLOW_stantard_function_enabling_using_in_standard_function10013);
                    stantard_function_enabling_using716=stantard_function_enabling_using();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) root_0 = (Object)adaptor.becomeRoot(stantard_function_enabling_using716.getTree(), root_0);

                    pushFollow(FOLLOW_function_argument_in_standard_function10016);
                    function_argument717=gPLSQLParser.function_argument();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, function_argument717.getTree());

                    // PLSQL_DMLParser.g:1044:62: ( using_clause )?
                    int alt232=2;
                    alt232 = dfa232.predict(input);
                    switch (alt232) {
                        case 1 :
                            // PLSQL_DMLParser.g:1044:62: using_clause
                            {
                            pushFollow(FOLLOW_using_clause_in_standard_function10018);
                            using_clause718=using_clause();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) adaptor.addChild(root_0, using_clause718.getTree());

                            }
                            break;

                    }


                    }
                    break;
                case 3 :
                    // PLSQL_DMLParser.g:1045:10: count_key ^ LEFT_PAREN ! ( ASTERISK | concatenation_wrapper ) RIGHT_PAREN ! ( over_clause )?
                    {
                    root_0 = (Object)adaptor.nil();


                    pushFollow(FOLLOW_count_key_in_standard_function10030);
                    count_key719=gPLSQLParser.count_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) root_0 = (Object)adaptor.becomeRoot(count_key719.getTree(), root_0);

                    LEFT_PAREN720=(Token)match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_standard_function10045); if (state.failed) return retval;

                    // PLSQL_DMLParser.g:1047:17: ( ASTERISK | concatenation_wrapper )
                    int alt233=2;
                    int LA233_0 = input.LA(1);

                    if ( (LA233_0==ASTERISK) ) {
                        alt233=1;
                    }
                    else if ( (LA233_0==APPROXIMATE_NUM_LIT||(LA233_0 >= CHAR_STRING && LA233_0 <= COLON)||LA233_0==DELIMITED_ID||LA233_0==EXACT_NUM_LIT||LA233_0==INTRODUCER||LA233_0==LEFT_PAREN||LA233_0==MINUS_SIGN||LA233_0==PLUS_SIGN||LA233_0==REGULAR_ID||LA233_0==SQL92_RESERVED_ALL||LA233_0==SQL92_RESERVED_ANY||LA233_0==SQL92_RESERVED_CASE||LA233_0==SQL92_RESERVED_DEFAULT||LA233_0==SQL92_RESERVED_DISTINCT||(LA233_0 >= SQL92_RESERVED_EXISTS && LA233_0 <= SQL92_RESERVED_FALSE)||LA233_0==SQL92_RESERVED_NULL||LA233_0==SQL92_RESERVED_PRIOR||LA233_0==SQL92_RESERVED_TRUE||LA233_0==UNSIGNED_INTEGER) ) {
                        alt233=2;
                    }
                    else {
                        if (state.backtracking>0) {state.failed=true; return retval;}
                        NoViableAltException nvae =
                            new NoViableAltException("", 233, 0, input);

                        throw nvae;

                    }
                    switch (alt233) {
                        case 1 :
                            // PLSQL_DMLParser.g:1047:19: ASTERISK
                            {
                            ASTERISK721=(Token)match(input,ASTERISK,FOLLOW_ASTERISK_in_standard_function10066); if (state.failed) return retval;
                            if ( state.backtracking==0 ) {
                            ASTERISK721_tree = 
                            (Object)adaptor.create(ASTERISK721)
                            ;
                            adaptor.addChild(root_0, ASTERISK721_tree);
                            }

                            }
                            break;
                        case 2 :
                            // PLSQL_DMLParser.g:1047:30: concatenation_wrapper
                            {
                            pushFollow(FOLLOW_concatenation_wrapper_in_standard_function10070);
                            concatenation_wrapper722=concatenation_wrapper();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) adaptor.addChild(root_0, concatenation_wrapper722.getTree());

                            }
                            break;

                    }


                    RIGHT_PAREN723=(Token)match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_standard_function10087); if (state.failed) return retval;

                    // PLSQL_DMLParser.g:1048:26: ( over_clause )?
                    int alt234=2;
                    int LA234_0 = input.LA(1);

                    if ( (LA234_0==REGULAR_ID) ) {
                        int LA234_1 = input.LA(2);

                        if ( (LA234_1==LEFT_PAREN) ) {
                            int LA234_3 = input.LA(3);

                            if ( (LA234_3==REGULAR_ID) ) {
                                int LA234_10 = input.LA(4);

                                if ( (LA234_10==SQL92_RESERVED_BY) && ((input.LT(1).getText().equalsIgnoreCase("over")))) {
                                    alt234=1;
                                }
                            }
                            else if ( (LA234_3==RIGHT_PAREN||LA234_3==SQL92_RESERVED_ORDER) && ((input.LT(1).getText().equalsIgnoreCase("over")))) {
                                alt234=1;
                            }
                        }
                    }
                    switch (alt234) {
                        case 1 :
                            // PLSQL_DMLParser.g:1048:26: over_clause
                            {
                            pushFollow(FOLLOW_over_clause_in_standard_function10090);
                            over_clause724=over_clause();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) adaptor.addChild(root_0, over_clause724.getTree());

                            }
                            break;

                    }


                    }
                    break;
                case 4 :
                    // PLSQL_DMLParser.g:1049:10: ( cast_key ^| xmlcast_key ^) LEFT_PAREN ! ( multiset_key ! LEFT_PAREN ! subquery RIGHT_PAREN | concatenation_wrapper ) as_key ! type_spec RIGHT_PAREN !
                    {
                    root_0 = (Object)adaptor.nil();


                    // PLSQL_DMLParser.g:1049:10: ( cast_key ^| xmlcast_key ^)
                    int alt235=2;
                    int LA235_0 = input.LA(1);

                    if ( (LA235_0==REGULAR_ID) ) {
                        int LA235_1 = input.LA(2);

                        if ( ((input.LT(1).getText().equalsIgnoreCase("cast"))) ) {
                            alt235=1;
                        }
                        else if ( ((input.LT(1).getText().equalsIgnoreCase("xmlcast"))) ) {
                            alt235=2;
                        }
                        else {
                            if (state.backtracking>0) {state.failed=true; return retval;}
                            NoViableAltException nvae =
                                new NoViableAltException("", 235, 1, input);

                            throw nvae;

                        }
                    }
                    else {
                        if (state.backtracking>0) {state.failed=true; return retval;}
                        NoViableAltException nvae =
                            new NoViableAltException("", 235, 0, input);

                        throw nvae;

                    }
                    switch (alt235) {
                        case 1 :
                            // PLSQL_DMLParser.g:1049:11: cast_key ^
                            {
                            pushFollow(FOLLOW_cast_key_in_standard_function10103);
                            cast_key725=gPLSQLParser.cast_key();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) root_0 = (Object)adaptor.becomeRoot(cast_key725.getTree(), root_0);

                            }
                            break;
                        case 2 :
                            // PLSQL_DMLParser.g:1049:21: xmlcast_key ^
                            {
                            pushFollow(FOLLOW_xmlcast_key_in_standard_function10106);
                            xmlcast_key726=gPLSQLParser.xmlcast_key();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) root_0 = (Object)adaptor.becomeRoot(xmlcast_key726.getTree(), root_0);

                            }
                            break;

                    }


                    LEFT_PAREN727=(Token)match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_standard_function10123); if (state.failed) return retval;

                    // PLSQL_DMLParser.g:1051:17: ( multiset_key ! LEFT_PAREN ! subquery RIGHT_PAREN | concatenation_wrapper )
                    int alt236=2;
                    int LA236_0 = input.LA(1);

                    if ( (LA236_0==REGULAR_ID) ) {
                        int LA236_1 = input.LA(2);

                        if ( ((input.LT(1).getText().equalsIgnoreCase("multiset"))) ) {
                            alt236=1;
                        }
                        else if ( (true) ) {
                            alt236=2;
                        }
                        else {
                            if (state.backtracking>0) {state.failed=true; return retval;}
                            NoViableAltException nvae =
                                new NoViableAltException("", 236, 1, input);

                            throw nvae;

                        }
                    }
                    else if ( (LA236_0==APPROXIMATE_NUM_LIT||(LA236_0 >= CHAR_STRING && LA236_0 <= COLON)||LA236_0==DELIMITED_ID||LA236_0==EXACT_NUM_LIT||LA236_0==INTRODUCER||LA236_0==LEFT_PAREN||LA236_0==MINUS_SIGN||LA236_0==PLUS_SIGN||LA236_0==SQL92_RESERVED_ALL||LA236_0==SQL92_RESERVED_ANY||LA236_0==SQL92_RESERVED_CASE||LA236_0==SQL92_RESERVED_DEFAULT||LA236_0==SQL92_RESERVED_DISTINCT||(LA236_0 >= SQL92_RESERVED_EXISTS && LA236_0 <= SQL92_RESERVED_FALSE)||LA236_0==SQL92_RESERVED_NULL||LA236_0==SQL92_RESERVED_PRIOR||LA236_0==SQL92_RESERVED_TRUE||LA236_0==UNSIGNED_INTEGER) ) {
                        alt236=2;
                    }
                    else {
                        if (state.backtracking>0) {state.failed=true; return retval;}
                        NoViableAltException nvae =
                            new NoViableAltException("", 236, 0, input);

                        throw nvae;

                    }
                    switch (alt236) {
                        case 1 :
                            // PLSQL_DMLParser.g:1051:18: multiset_key ! LEFT_PAREN ! subquery RIGHT_PAREN
                            {
                            pushFollow(FOLLOW_multiset_key_in_standard_function10143);
                            multiset_key728=gPLSQLParser.multiset_key();

                            state._fsp--;
                            if (state.failed) return retval;

                            LEFT_PAREN729=(Token)match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_standard_function10146); if (state.failed) return retval;

                            pushFollow(FOLLOW_subquery_in_standard_function10149);
                            subquery730=subquery();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) adaptor.addChild(root_0, subquery730.getTree());

                            RIGHT_PAREN731=(Token)match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_standard_function10151); if (state.failed) return retval;
                            if ( state.backtracking==0 ) {
                            RIGHT_PAREN731_tree = 
                            (Object)adaptor.create(RIGHT_PAREN731)
                            ;
                            adaptor.addChild(root_0, RIGHT_PAREN731_tree);
                            }

                            }
                            break;
                        case 2 :
                            // PLSQL_DMLParser.g:1051:65: concatenation_wrapper
                            {
                            pushFollow(FOLLOW_concatenation_wrapper_in_standard_function10153);
                            concatenation_wrapper732=concatenation_wrapper();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) adaptor.addChild(root_0, concatenation_wrapper732.getTree());

                            }
                            break;

                    }


                    pushFollow(FOLLOW_as_key_in_standard_function10156);
                    as_key733=gPLSQLParser.as_key();

                    state._fsp--;
                    if (state.failed) return retval;

                    pushFollow(FOLLOW_type_spec_in_standard_function10159);
                    type_spec734=gPLSQLParser.type_spec();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, type_spec734.getTree());

                    RIGHT_PAREN735=(Token)match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_standard_function10174); if (state.failed) return retval;

                    }
                    break;
                case 5 :
                    // PLSQL_DMLParser.g:1053:10: chr_key ^ LEFT_PAREN ! concatenation_wrapper using_key ! nchar_cs_key RIGHT_PAREN !
                    {
                    root_0 = (Object)adaptor.nil();


                    pushFollow(FOLLOW_chr_key_in_standard_function10186);
                    chr_key736=gPLSQLParser.chr_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) root_0 = (Object)adaptor.becomeRoot(chr_key736.getTree(), root_0);

                    LEFT_PAREN737=(Token)match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_standard_function10201); if (state.failed) return retval;

                    pushFollow(FOLLOW_concatenation_wrapper_in_standard_function10221);
                    concatenation_wrapper738=concatenation_wrapper();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, concatenation_wrapper738.getTree());

                    pushFollow(FOLLOW_using_key_in_standard_function10223);
                    using_key739=gPLSQLParser.using_key();

                    state._fsp--;
                    if (state.failed) return retval;

                    pushFollow(FOLLOW_nchar_cs_key_in_standard_function10226);
                    nchar_cs_key740=gPLSQLParser.nchar_cs_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, nchar_cs_key740.getTree());

                    RIGHT_PAREN741=(Token)match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_standard_function10241); if (state.failed) return retval;

                    }
                    break;
                case 6 :
                    // PLSQL_DMLParser.g:1057:10: collect_key ^ LEFT_PAREN ! ( distinct_key | unique_key )? column_name ( collect_order_by_part )? RIGHT_PAREN !
                    {
                    root_0 = (Object)adaptor.nil();


                    pushFollow(FOLLOW_collect_key_in_standard_function10253);
                    collect_key742=gPLSQLParser.collect_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) root_0 = (Object)adaptor.becomeRoot(collect_key742.getTree(), root_0);

                    LEFT_PAREN743=(Token)match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_standard_function10268); if (state.failed) return retval;

                    // PLSQL_DMLParser.g:1059:17: ( distinct_key | unique_key )?
                    int alt237=3;
                    int LA237_0 = input.LA(1);

                    if ( (LA237_0==SQL92_RESERVED_DISTINCT) ) {
                        alt237=1;
                    }
                    else if ( (LA237_0==SQL92_RESERVED_UNIQUE) ) {
                        alt237=2;
                    }
                    switch (alt237) {
                        case 1 :
                            // PLSQL_DMLParser.g:1059:18: distinct_key
                            {
                            pushFollow(FOLLOW_distinct_key_in_standard_function10289);
                            distinct_key744=gPLSQLParser.distinct_key();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) adaptor.addChild(root_0, distinct_key744.getTree());

                            }
                            break;
                        case 2 :
                            // PLSQL_DMLParser.g:1059:31: unique_key
                            {
                            pushFollow(FOLLOW_unique_key_in_standard_function10291);
                            unique_key745=gPLSQLParser.unique_key();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) adaptor.addChild(root_0, unique_key745.getTree());

                            }
                            break;

                    }


                    pushFollow(FOLLOW_column_name_in_standard_function10295);
                    column_name746=gPLSQLParser.column_name();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, column_name746.getTree());

                    // PLSQL_DMLParser.g:1059:56: ( collect_order_by_part )?
                    int alt238=2;
                    int LA238_0 = input.LA(1);

                    if ( (LA238_0==SQL92_RESERVED_ORDER) ) {
                        alt238=1;
                    }
                    switch (alt238) {
                        case 1 :
                            // PLSQL_DMLParser.g:1059:56: collect_order_by_part
                            {
                            pushFollow(FOLLOW_collect_order_by_part_in_standard_function10297);
                            collect_order_by_part747=collect_order_by_part();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) adaptor.addChild(root_0, collect_order_by_part747.getTree());

                            }
                            break;

                    }


                    RIGHT_PAREN748=(Token)match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_standard_function10312); if (state.failed) return retval;

                    }
                    break;
                case 7 :
                    // PLSQL_DMLParser.g:1061:10: stantard_function_enabling_within_or_over ^ function_argument ( within_or_over_part )+
                    {
                    root_0 = (Object)adaptor.nil();


                    pushFollow(FOLLOW_stantard_function_enabling_within_or_over_in_standard_function10324);
                    stantard_function_enabling_within_or_over749=stantard_function_enabling_within_or_over();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) root_0 = (Object)adaptor.becomeRoot(stantard_function_enabling_within_or_over749.getTree(), root_0);

                    pushFollow(FOLLOW_function_argument_in_standard_function10340);
                    function_argument750=gPLSQLParser.function_argument();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, function_argument750.getTree());

                    // PLSQL_DMLParser.g:1062:31: ( within_or_over_part )+
                    int cnt239=0;
                    loop239:
                    do {
                        int alt239=2;
                        int LA239_0 = input.LA(1);

                        if ( (LA239_0==REGULAR_ID) ) {
                            int LA239_1 = input.LA(2);

                            if ( (LA239_1==LEFT_PAREN) ) {
                                int LA239_3 = input.LA(3);

                                if ( (LA239_3==REGULAR_ID) ) {
                                    int LA239_11 = input.LA(4);

                                    if ( (LA239_11==SQL92_RESERVED_BY) && ((input.LT(1).getText().equalsIgnoreCase("over")))) {
                                        alt239=1;
                                    }


                                }
                                else if ( (LA239_3==RIGHT_PAREN||LA239_3==SQL92_RESERVED_ORDER) && ((input.LT(1).getText().equalsIgnoreCase("over")))) {
                                    alt239=1;
                                }


                            }
                            else if ( (LA239_1==SQL92_RESERVED_GROUP) ) {
                                int LA239_4 = input.LA(3);

                                if ( (LA239_4==LEFT_PAREN) && ((input.LT(1).getText().equalsIgnoreCase("within")))) {
                                    alt239=1;
                                }


                            }


                        }


                        switch (alt239) {
                    	case 1 :
                    	    // PLSQL_DMLParser.g:1062:31: within_or_over_part
                    	    {
                    	    pushFollow(FOLLOW_within_or_over_part_in_standard_function10342);
                    	    within_or_over_part751=within_or_over_part();

                    	    state._fsp--;
                    	    if (state.failed) return retval;
                    	    if ( state.backtracking==0 ) adaptor.addChild(root_0, within_or_over_part751.getTree());

                    	    }
                    	    break;

                    	default :
                    	    if ( cnt239 >= 1 ) break loop239;
                    	    if (state.backtracking>0) {state.failed=true; return retval;}
                                EarlyExitException eee =
                                    new EarlyExitException(239, input);
                                throw eee;
                        }
                        cnt239++;
                    } while (true);


                    }
                    break;
                case 8 :
                    // PLSQL_DMLParser.g:1063:10: decompose_key ^ LEFT_PAREN ! concatenation_wrapper ( canonical_key | compatibility_key )? RIGHT_PAREN !
                    {
                    root_0 = (Object)adaptor.nil();


                    pushFollow(FOLLOW_decompose_key_in_standard_function10354);
                    decompose_key752=gPLSQLParser.decompose_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) root_0 = (Object)adaptor.becomeRoot(decompose_key752.getTree(), root_0);

                    LEFT_PAREN753=(Token)match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_standard_function10369); if (state.failed) return retval;

                    pushFollow(FOLLOW_concatenation_wrapper_in_standard_function10389);
                    concatenation_wrapper754=concatenation_wrapper();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, concatenation_wrapper754.getTree());

                    // PLSQL_DMLParser.g:1065:39: ( canonical_key | compatibility_key )?
                    int alt240=3;
                    int LA240_0 = input.LA(1);

                    if ( (LA240_0==REGULAR_ID) && (((input.LT(1).getText().equalsIgnoreCase("canonical"))||(input.LT(1).getText().equalsIgnoreCase("compatibility"))))) {
                        int LA240_1 = input.LA(2);

                        if ( ((input.LT(1).getText().equalsIgnoreCase("canonical"))) ) {
                            alt240=1;
                        }
                        else if ( ((input.LT(1).getText().equalsIgnoreCase("compatibility"))) ) {
                            alt240=2;
                        }
                    }
                    switch (alt240) {
                        case 1 :
                            // PLSQL_DMLParser.g:1065:40: canonical_key
                            {
                            pushFollow(FOLLOW_canonical_key_in_standard_function10392);
                            canonical_key755=gPLSQLParser.canonical_key();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) adaptor.addChild(root_0, canonical_key755.getTree());

                            }
                            break;
                        case 2 :
                            // PLSQL_DMLParser.g:1065:54: compatibility_key
                            {
                            pushFollow(FOLLOW_compatibility_key_in_standard_function10394);
                            compatibility_key756=gPLSQLParser.compatibility_key();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) adaptor.addChild(root_0, compatibility_key756.getTree());

                            }
                            break;

                    }


                    RIGHT_PAREN757=(Token)match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_standard_function10411); if (state.failed) return retval;

                    }
                    break;
                case 9 :
                    // PLSQL_DMLParser.g:1067:10: extract_key ^ LEFT_PAREN ! REGULAR_ID from_key ! concatenation_wrapper RIGHT_PAREN !
                    {
                    root_0 = (Object)adaptor.nil();


                    pushFollow(FOLLOW_extract_key_in_standard_function10423);
                    extract_key758=gPLSQLParser.extract_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) root_0 = (Object)adaptor.becomeRoot(extract_key758.getTree(), root_0);

                    LEFT_PAREN759=(Token)match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_standard_function10438); if (state.failed) return retval;

                    REGULAR_ID760=(Token)match(input,REGULAR_ID,FOLLOW_REGULAR_ID_in_standard_function10457); if (state.failed) return retval;
                    if ( state.backtracking==0 ) {
                    REGULAR_ID760_tree = 
                    (Object)adaptor.create(REGULAR_ID760)
                    ;
                    adaptor.addChild(root_0, REGULAR_ID760_tree);
                    }

                    pushFollow(FOLLOW_from_key_in_standard_function10459);
                    from_key761=gPLSQLParser.from_key();

                    state._fsp--;
                    if (state.failed) return retval;

                    pushFollow(FOLLOW_concatenation_wrapper_in_standard_function10462);
                    concatenation_wrapper762=concatenation_wrapper();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, concatenation_wrapper762.getTree());

                    RIGHT_PAREN763=(Token)match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_standard_function10477); if (state.failed) return retval;

                    }
                    break;
                case 10 :
                    // PLSQL_DMLParser.g:1071:10: ( first_value_key ^| last_value_key ^) LEFT_PAREN ! concatenation_wrapper ( ignore_key ! nulls_key )? RIGHT_PAREN ! over_clause
                    {
                    root_0 = (Object)adaptor.nil();


                    // PLSQL_DMLParser.g:1071:10: ( first_value_key ^| last_value_key ^)
                    int alt241=2;
                    int LA241_0 = input.LA(1);

                    if ( (LA241_0==REGULAR_ID) && (((input.LT(1).getText().equalsIgnoreCase("first_value"))||(input.LT(1).getText().equalsIgnoreCase("last_value"))))) {
                        int LA241_1 = input.LA(2);

                        if ( ((input.LT(1).getText().equalsIgnoreCase("first_value"))) ) {
                            alt241=1;
                        }
                        else if ( ((input.LT(1).getText().equalsIgnoreCase("last_value"))) ) {
                            alt241=2;
                        }
                        else {
                            if (state.backtracking>0) {state.failed=true; return retval;}
                            NoViableAltException nvae =
                                new NoViableAltException("", 241, 1, input);

                            throw nvae;

                        }
                    }
                    else {
                        if (state.backtracking>0) {state.failed=true; return retval;}
                        NoViableAltException nvae =
                            new NoViableAltException("", 241, 0, input);

                        throw nvae;

                    }
                    switch (alt241) {
                        case 1 :
                            // PLSQL_DMLParser.g:1071:11: first_value_key ^
                            {
                            pushFollow(FOLLOW_first_value_key_in_standard_function10490);
                            first_value_key764=gPLSQLParser.first_value_key();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) root_0 = (Object)adaptor.becomeRoot(first_value_key764.getTree(), root_0);

                            }
                            break;
                        case 2 :
                            // PLSQL_DMLParser.g:1071:28: last_value_key ^
                            {
                            pushFollow(FOLLOW_last_value_key_in_standard_function10493);
                            last_value_key765=gPLSQLParser.last_value_key();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) root_0 = (Object)adaptor.becomeRoot(last_value_key765.getTree(), root_0);

                            }
                            break;

                    }


                    LEFT_PAREN766=(Token)match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_standard_function10510); if (state.failed) return retval;

                    pushFollow(FOLLOW_concatenation_wrapper_in_standard_function10529);
                    concatenation_wrapper767=concatenation_wrapper();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, concatenation_wrapper767.getTree());

                    // PLSQL_DMLParser.g:1073:39: ( ignore_key ! nulls_key )?
                    int alt242=2;
                    int LA242_0 = input.LA(1);

                    if ( (LA242_0==REGULAR_ID) && ((input.LT(1).getText().equalsIgnoreCase("ignore")))) {
                        alt242=1;
                    }
                    switch (alt242) {
                        case 1 :
                            // PLSQL_DMLParser.g:1073:40: ignore_key ! nulls_key
                            {
                            pushFollow(FOLLOW_ignore_key_in_standard_function10532);
                            ignore_key768=gPLSQLParser.ignore_key();

                            state._fsp--;
                            if (state.failed) return retval;

                            pushFollow(FOLLOW_nulls_key_in_standard_function10535);
                            nulls_key769=gPLSQLParser.nulls_key();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) adaptor.addChild(root_0, nulls_key769.getTree());

                            }
                            break;

                    }


                    RIGHT_PAREN770=(Token)match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_standard_function10552); if (state.failed) return retval;

                    pushFollow(FOLLOW_over_clause_in_standard_function10555);
                    over_clause771=over_clause();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, over_clause771.getTree());

                    }
                    break;
                case 11 :
                    // PLSQL_DMLParser.g:1075:10: stantard_function_pedictions ^ LEFT_PAREN ! expression_wrapper ( COMMA expression_wrapper )* ( cost_matrix_clause )? ( using_clause )? RIGHT_PAREN !
                    {
                    root_0 = (Object)adaptor.nil();


                    pushFollow(FOLLOW_stantard_function_pedictions_in_standard_function10566);
                    stantard_function_pedictions772=stantard_function_pedictions();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) root_0 = (Object)adaptor.becomeRoot(stantard_function_pedictions772.getTree(), root_0);

                    LEFT_PAREN773=(Token)match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_standard_function10581); if (state.failed) return retval;

                    pushFollow(FOLLOW_expression_wrapper_in_standard_function10600);
                    expression_wrapper774=expression_wrapper();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, expression_wrapper774.getTree());

                    // PLSQL_DMLParser.g:1077:36: ( COMMA expression_wrapper )*
                    loop243:
                    do {
                        int alt243=2;
                        int LA243_0 = input.LA(1);

                        if ( (LA243_0==COMMA) ) {
                            alt243=1;
                        }


                        switch (alt243) {
                    	case 1 :
                    	    // PLSQL_DMLParser.g:1077:37: COMMA expression_wrapper
                    	    {
                    	    COMMA775=(Token)match(input,COMMA,FOLLOW_COMMA_in_standard_function10603); if (state.failed) return retval;
                    	    if ( state.backtracking==0 ) {
                    	    COMMA775_tree = 
                    	    (Object)adaptor.create(COMMA775)
                    	    ;
                    	    adaptor.addChild(root_0, COMMA775_tree);
                    	    }

                    	    pushFollow(FOLLOW_expression_wrapper_in_standard_function10605);
                    	    expression_wrapper776=expression_wrapper();

                    	    state._fsp--;
                    	    if (state.failed) return retval;
                    	    if ( state.backtracking==0 ) adaptor.addChild(root_0, expression_wrapper776.getTree());

                    	    }
                    	    break;

                    	default :
                    	    break loop243;
                        }
                    } while (true);


                    // PLSQL_DMLParser.g:1077:64: ( cost_matrix_clause )?
                    int alt244=2;
                    int LA244_0 = input.LA(1);

                    if ( (LA244_0==REGULAR_ID) && ((input.LT(1).getText().equalsIgnoreCase("cost")))) {
                        alt244=1;
                    }
                    switch (alt244) {
                        case 1 :
                            // PLSQL_DMLParser.g:1077:64: cost_matrix_clause
                            {
                            pushFollow(FOLLOW_cost_matrix_clause_in_standard_function10609);
                            cost_matrix_clause777=cost_matrix_clause();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) adaptor.addChild(root_0, cost_matrix_clause777.getTree());

                            }
                            break;

                    }


                    // PLSQL_DMLParser.g:1077:84: ( using_clause )?
                    int alt245=2;
                    int LA245_0 = input.LA(1);

                    if ( (LA245_0==PLSQL_NON_RESERVED_USING) ) {
                        alt245=1;
                    }
                    switch (alt245) {
                        case 1 :
                            // PLSQL_DMLParser.g:1077:84: using_clause
                            {
                            pushFollow(FOLLOW_using_clause_in_standard_function10612);
                            using_clause778=using_clause();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) adaptor.addChild(root_0, using_clause778.getTree());

                            }
                            break;

                    }


                    RIGHT_PAREN779=(Token)match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_standard_function10628); if (state.failed) return retval;

                    }
                    break;
                case 12 :
                    // PLSQL_DMLParser.g:1079:10: translate_key ^ LEFT_PAREN ! expression_wrapper ( using_key ! ( char_cs_key | nchar_cs_key ) )? ( COMMA expression_wrapper )* RIGHT_PAREN !
                    {
                    root_0 = (Object)adaptor.nil();


                    pushFollow(FOLLOW_translate_key_in_standard_function10640);
                    translate_key780=gPLSQLParser.translate_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) root_0 = (Object)adaptor.becomeRoot(translate_key780.getTree(), root_0);

                    LEFT_PAREN781=(Token)match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_standard_function10655); if (state.failed) return retval;

                    pushFollow(FOLLOW_expression_wrapper_in_standard_function10675);
                    expression_wrapper782=expression_wrapper();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, expression_wrapper782.getTree());

                    // PLSQL_DMLParser.g:1081:36: ( using_key ! ( char_cs_key | nchar_cs_key ) )?
                    int alt247=2;
                    int LA247_0 = input.LA(1);

                    if ( (LA247_0==PLSQL_NON_RESERVED_USING) ) {
                        alt247=1;
                    }
                    switch (alt247) {
                        case 1 :
                            // PLSQL_DMLParser.g:1081:37: using_key ! ( char_cs_key | nchar_cs_key )
                            {
                            pushFollow(FOLLOW_using_key_in_standard_function10678);
                            using_key783=gPLSQLParser.using_key();

                            state._fsp--;
                            if (state.failed) return retval;

                            // PLSQL_DMLParser.g:1081:48: ( char_cs_key | nchar_cs_key )
                            int alt246=2;
                            int LA246_0 = input.LA(1);

                            if ( (LA246_0==REGULAR_ID) && (((input.LT(1).getText().equalsIgnoreCase("char_cs"))||(input.LT(1).getText().equalsIgnoreCase("nchar_cs"))))) {
                                int LA246_1 = input.LA(2);

                                if ( ((input.LT(1).getText().equalsIgnoreCase("char_cs"))) ) {
                                    alt246=1;
                                }
                                else if ( ((input.LT(1).getText().equalsIgnoreCase("nchar_cs"))) ) {
                                    alt246=2;
                                }
                                else {
                                    if (state.backtracking>0) {state.failed=true; return retval;}
                                    NoViableAltException nvae =
                                        new NoViableAltException("", 246, 1, input);

                                    throw nvae;

                                }
                            }
                            else {
                                if (state.backtracking>0) {state.failed=true; return retval;}
                                NoViableAltException nvae =
                                    new NoViableAltException("", 246, 0, input);

                                throw nvae;

                            }
                            switch (alt246) {
                                case 1 :
                                    // PLSQL_DMLParser.g:1081:49: char_cs_key
                                    {
                                    pushFollow(FOLLOW_char_cs_key_in_standard_function10682);
                                    char_cs_key784=gPLSQLParser.char_cs_key();

                                    state._fsp--;
                                    if (state.failed) return retval;
                                    if ( state.backtracking==0 ) adaptor.addChild(root_0, char_cs_key784.getTree());

                                    }
                                    break;
                                case 2 :
                                    // PLSQL_DMLParser.g:1081:61: nchar_cs_key
                                    {
                                    pushFollow(FOLLOW_nchar_cs_key_in_standard_function10684);
                                    nchar_cs_key785=gPLSQLParser.nchar_cs_key();

                                    state._fsp--;
                                    if (state.failed) return retval;
                                    if ( state.backtracking==0 ) adaptor.addChild(root_0, nchar_cs_key785.getTree());

                                    }
                                    break;

                            }


                            }
                            break;

                    }


                    // PLSQL_DMLParser.g:1082:21: ( COMMA expression_wrapper )*
                    loop248:
                    do {
                        int alt248=2;
                        int LA248_0 = input.LA(1);

                        if ( (LA248_0==COMMA) ) {
                            alt248=1;
                        }


                        switch (alt248) {
                    	case 1 :
                    	    // PLSQL_DMLParser.g:1082:22: COMMA expression_wrapper
                    	    {
                    	    COMMA786=(Token)match(input,COMMA,FOLLOW_COMMA_in_standard_function10711); if (state.failed) return retval;
                    	    if ( state.backtracking==0 ) {
                    	    COMMA786_tree = 
                    	    (Object)adaptor.create(COMMA786)
                    	    ;
                    	    adaptor.addChild(root_0, COMMA786_tree);
                    	    }

                    	    pushFollow(FOLLOW_expression_wrapper_in_standard_function10713);
                    	    expression_wrapper787=expression_wrapper();

                    	    state._fsp--;
                    	    if (state.failed) return retval;
                    	    if ( state.backtracking==0 ) adaptor.addChild(root_0, expression_wrapper787.getTree());

                    	    }
                    	    break;

                    	default :
                    	    break loop248;
                        }
                    } while (true);


                    RIGHT_PAREN788=(Token)match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_standard_function10730); if (state.failed) return retval;

                    }
                    break;
                case 13 :
                    // PLSQL_DMLParser.g:1084:10: treat_key ^ LEFT_PAREN ! expression_wrapper as_key ! ( ref_key )? type_spec RIGHT_PAREN !
                    {
                    root_0 = (Object)adaptor.nil();


                    pushFollow(FOLLOW_treat_key_in_standard_function10742);
                    treat_key789=gPLSQLParser.treat_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) root_0 = (Object)adaptor.becomeRoot(treat_key789.getTree(), root_0);

                    LEFT_PAREN790=(Token)match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_standard_function10757); if (state.failed) return retval;

                    pushFollow(FOLLOW_expression_wrapper_in_standard_function10776);
                    expression_wrapper791=expression_wrapper();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, expression_wrapper791.getTree());

                    pushFollow(FOLLOW_as_key_in_standard_function10778);
                    as_key792=gPLSQLParser.as_key();

                    state._fsp--;
                    if (state.failed) return retval;

                    // PLSQL_DMLParser.g:1086:44: ( ref_key )?
                    int alt249=2;
                    int LA249_0 = input.LA(1);

                    if ( (LA249_0==REGULAR_ID) ) {
                        int LA249_1 = input.LA(2);

                        if ( ((input.LT(1).getText().equalsIgnoreCase("ref"))) ) {
                            alt249=1;
                        }
                    }
                    switch (alt249) {
                        case 1 :
                            // PLSQL_DMLParser.g:1086:44: ref_key
                            {
                            pushFollow(FOLLOW_ref_key_in_standard_function10781);
                            ref_key793=gPLSQLParser.ref_key();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) adaptor.addChild(root_0, ref_key793.getTree());

                            }
                            break;

                    }


                    pushFollow(FOLLOW_type_spec_in_standard_function10784);
                    type_spec794=gPLSQLParser.type_spec();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, type_spec794.getTree());

                    RIGHT_PAREN795=(Token)match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_standard_function10799); if (state.failed) return retval;

                    }
                    break;
                case 14 :
                    // PLSQL_DMLParser.g:1088:10: trim_key ^ LEFT_PAREN ! ( ( leading_key | trailing_key | both_key )? concatenation_wrapper from_key !)? concatenation_wrapper RIGHT_PAREN !
                    {
                    root_0 = (Object)adaptor.nil();


                    pushFollow(FOLLOW_trim_key_in_standard_function10811);
                    trim_key796=gPLSQLParser.trim_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) root_0 = (Object)adaptor.becomeRoot(trim_key796.getTree(), root_0);

                    LEFT_PAREN797=(Token)match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_standard_function10826); if (state.failed) return retval;

                    // PLSQL_DMLParser.g:1090:17: ( ( leading_key | trailing_key | both_key )? concatenation_wrapper from_key !)?
                    int alt251=2;
                    switch ( input.LA(1) ) {
                        case REGULAR_ID:
                            {
                            alt251=1;
                            }
                            break;
                        case MINUS_SIGN:
                            {
                            alt251=1;
                            }
                            break;
                        case PLUS_SIGN:
                            {
                            alt251=1;
                            }
                            break;
                        case SQL92_RESERVED_PRIOR:
                            {
                            alt251=1;
                            }
                            break;
                        case SQL92_RESERVED_DISTINCT:
                            {
                            alt251=1;
                            }
                            break;
                        case SQL92_RESERVED_ALL:
                            {
                            alt251=1;
                            }
                            break;
                        case DELIMITED_ID:
                            {
                            alt251=1;
                            }
                            break;
                        case SQL92_RESERVED_CASE:
                            {
                            int LA251_8 = input.LA(2);

                            if ( (((input.LA(1) == SQL92_RESERVED_CASE || input.LA(2) == SQL92_RESERVED_CASE))) ) {
                                alt251=1;
                            }
                            }
                            break;
                        case SQL92_RESERVED_EXISTS:
                            {
                            alt251=1;
                            }
                            break;
                        case SQL92_RESERVED_ANY:
                            {
                            alt251=1;
                            }
                            break;
                        case APPROXIMATE_NUM_LIT:
                        case EXACT_NUM_LIT:
                        case UNSIGNED_INTEGER:
                            {
                            alt251=1;
                            }
                            break;
                        case CHAR_STRING:
                            {
                            alt251=1;
                            }
                            break;
                        case SQL92_RESERVED_NULL:
                            {
                            alt251=1;
                            }
                            break;
                        case SQL92_RESERVED_TRUE:
                            {
                            alt251=1;
                            }
                            break;
                        case SQL92_RESERVED_FALSE:
                            {
                            alt251=1;
                            }
                            break;
                        case SQL92_RESERVED_DEFAULT:
                            {
                            alt251=1;
                            }
                            break;
                        case INTRODUCER:
                            {
                            alt251=1;
                            }
                            break;
                        case COLON:
                            {
                            alt251=1;
                            }
                            break;
                        case LEFT_PAREN:
                            {
                            alt251=1;
                            }
                            break;
                    }

                    switch (alt251) {
                        case 1 :
                            // PLSQL_DMLParser.g:1090:18: ( leading_key | trailing_key | both_key )? concatenation_wrapper from_key !
                            {
                            // PLSQL_DMLParser.g:1090:18: ( leading_key | trailing_key | both_key )?
                            int alt250=4;
                            int LA250_0 = input.LA(1);

                            if ( (LA250_0==REGULAR_ID) ) {
                                int LA250_1 = input.LA(2);

                                if ( ((input.LT(1).getText().equalsIgnoreCase("leading"))) ) {
                                    alt250=1;
                                }
                                else if ( ((input.LT(1).getText().equalsIgnoreCase("trailing"))) ) {
                                    alt250=2;
                                }
                                else if ( ((input.LT(1).getText().equalsIgnoreCase("both"))) ) {
                                    alt250=3;
                                }
                            }
                            switch (alt250) {
                                case 1 :
                                    // PLSQL_DMLParser.g:1090:19: leading_key
                                    {
                                    pushFollow(FOLLOW_leading_key_in_standard_function10848);
                                    leading_key798=gPLSQLParser.leading_key();

                                    state._fsp--;
                                    if (state.failed) return retval;
                                    if ( state.backtracking==0 ) adaptor.addChild(root_0, leading_key798.getTree());

                                    }
                                    break;
                                case 2 :
                                    // PLSQL_DMLParser.g:1090:31: trailing_key
                                    {
                                    pushFollow(FOLLOW_trailing_key_in_standard_function10850);
                                    trailing_key799=gPLSQLParser.trailing_key();

                                    state._fsp--;
                                    if (state.failed) return retval;
                                    if ( state.backtracking==0 ) adaptor.addChild(root_0, trailing_key799.getTree());

                                    }
                                    break;
                                case 3 :
                                    // PLSQL_DMLParser.g:1090:44: both_key
                                    {
                                    pushFollow(FOLLOW_both_key_in_standard_function10852);
                                    both_key800=gPLSQLParser.both_key();

                                    state._fsp--;
                                    if (state.failed) return retval;
                                    if ( state.backtracking==0 ) adaptor.addChild(root_0, both_key800.getTree());

                                    }
                                    break;

                            }


                            pushFollow(FOLLOW_concatenation_wrapper_in_standard_function10856);
                            concatenation_wrapper801=concatenation_wrapper();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) adaptor.addChild(root_0, concatenation_wrapper801.getTree());

                            pushFollow(FOLLOW_from_key_in_standard_function10858);
                            from_key802=gPLSQLParser.from_key();

                            state._fsp--;
                            if (state.failed) return retval;

                            }
                            break;

                    }


                    pushFollow(FOLLOW_concatenation_wrapper_in_standard_function10863);
                    concatenation_wrapper803=concatenation_wrapper();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, concatenation_wrapper803.getTree());

                    RIGHT_PAREN804=(Token)match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_standard_function10878); if (state.failed) return retval;

                    }
                    break;
                case 15 :
                    // PLSQL_DMLParser.g:1092:10: xmlagg_key ^ LEFT_PAREN ! expression_wrapper ( order_by_clause )? RIGHT_PAREN !
                    {
                    root_0 = (Object)adaptor.nil();


                    pushFollow(FOLLOW_xmlagg_key_in_standard_function10890);
                    xmlagg_key805=gPLSQLParser.xmlagg_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) root_0 = (Object)adaptor.becomeRoot(xmlagg_key805.getTree(), root_0);

                    LEFT_PAREN806=(Token)match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_standard_function10905); if (state.failed) return retval;

                    pushFollow(FOLLOW_expression_wrapper_in_standard_function10925);
                    expression_wrapper807=expression_wrapper();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, expression_wrapper807.getTree());

                    // PLSQL_DMLParser.g:1094:36: ( order_by_clause )?
                    int alt252=2;
                    int LA252_0 = input.LA(1);

                    if ( (LA252_0==SQL92_RESERVED_ORDER) ) {
                        alt252=1;
                    }
                    switch (alt252) {
                        case 1 :
                            // PLSQL_DMLParser.g:1094:36: order_by_clause
                            {
                            pushFollow(FOLLOW_order_by_clause_in_standard_function10927);
                            order_by_clause808=order_by_clause();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) adaptor.addChild(root_0, order_by_clause808.getTree());

                            }
                            break;

                    }


                    RIGHT_PAREN809=(Token)match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_standard_function10943); if (state.failed) return retval;

                    }
                    break;
                case 16 :
                    // PLSQL_DMLParser.g:1096:10: ( xmlcolattval_key ^| xmlforest_key ^) LEFT_PAREN ! xml_multiuse_expression_element ( COMMA ! xml_multiuse_expression_element )* RIGHT_PAREN !
                    {
                    root_0 = (Object)adaptor.nil();


                    // PLSQL_DMLParser.g:1096:10: ( xmlcolattval_key ^| xmlforest_key ^)
                    int alt253=2;
                    int LA253_0 = input.LA(1);

                    if ( (LA253_0==REGULAR_ID) && (((input.LT(1).getText().equalsIgnoreCase("xmlcolattval"))||(input.LT(1).getText().equalsIgnoreCase("xmlforest"))))) {
                        int LA253_1 = input.LA(2);

                        if ( ((input.LT(1).getText().equalsIgnoreCase("xmlcolattval"))) ) {
                            alt253=1;
                        }
                        else if ( ((input.LT(1).getText().equalsIgnoreCase("xmlforest"))) ) {
                            alt253=2;
                        }
                        else {
                            if (state.backtracking>0) {state.failed=true; return retval;}
                            NoViableAltException nvae =
                                new NoViableAltException("", 253, 1, input);

                            throw nvae;

                        }
                    }
                    else {
                        if (state.backtracking>0) {state.failed=true; return retval;}
                        NoViableAltException nvae =
                            new NoViableAltException("", 253, 0, input);

                        throw nvae;

                    }
                    switch (alt253) {
                        case 1 :
                            // PLSQL_DMLParser.g:1096:11: xmlcolattval_key ^
                            {
                            pushFollow(FOLLOW_xmlcolattval_key_in_standard_function10956);
                            xmlcolattval_key810=gPLSQLParser.xmlcolattval_key();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) root_0 = (Object)adaptor.becomeRoot(xmlcolattval_key810.getTree(), root_0);

                            }
                            break;
                        case 2 :
                            // PLSQL_DMLParser.g:1096:29: xmlforest_key ^
                            {
                            pushFollow(FOLLOW_xmlforest_key_in_standard_function10959);
                            xmlforest_key811=gPLSQLParser.xmlforest_key();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) root_0 = (Object)adaptor.becomeRoot(xmlforest_key811.getTree(), root_0);

                            }
                            break;

                    }


                    LEFT_PAREN812=(Token)match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_standard_function10976); if (state.failed) return retval;

                    pushFollow(FOLLOW_xml_multiuse_expression_element_in_standard_function10995);
                    xml_multiuse_expression_element813=xml_multiuse_expression_element();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, xml_multiuse_expression_element813.getTree());

                    // PLSQL_DMLParser.g:1098:49: ( COMMA ! xml_multiuse_expression_element )*
                    loop254:
                    do {
                        int alt254=2;
                        int LA254_0 = input.LA(1);

                        if ( (LA254_0==COMMA) ) {
                            alt254=1;
                        }


                        switch (alt254) {
                    	case 1 :
                    	    // PLSQL_DMLParser.g:1098:50: COMMA ! xml_multiuse_expression_element
                    	    {
                    	    COMMA814=(Token)match(input,COMMA,FOLLOW_COMMA_in_standard_function10998); if (state.failed) return retval;

                    	    pushFollow(FOLLOW_xml_multiuse_expression_element_in_standard_function11001);
                    	    xml_multiuse_expression_element815=xml_multiuse_expression_element();

                    	    state._fsp--;
                    	    if (state.failed) return retval;
                    	    if ( state.backtracking==0 ) adaptor.addChild(root_0, xml_multiuse_expression_element815.getTree());

                    	    }
                    	    break;

                    	default :
                    	    break loop254;
                        }
                    } while (true);


                    RIGHT_PAREN816=(Token)match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_standard_function11017); if (state.failed) return retval;

                    }
                    break;
                case 17 :
                    // PLSQL_DMLParser.g:1100:10: xmlelement_key ^ LEFT_PAREN ! ( entityescaping_key | noentityescaping_key )? ( name_key | evalname_key )? expression_wrapper ({...}? COMMA ! xml_attributes_clause )? ( COMMA ! expression_wrapper ( alias )? )* RIGHT_PAREN !
                    {
                    root_0 = (Object)adaptor.nil();


                    pushFollow(FOLLOW_xmlelement_key_in_standard_function11029);
                    xmlelement_key817=gPLSQLParser.xmlelement_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) root_0 = (Object)adaptor.becomeRoot(xmlelement_key817.getTree(), root_0);

                    LEFT_PAREN818=(Token)match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_standard_function11044); if (state.failed) return retval;

                    // PLSQL_DMLParser.g:1102:17: ( entityescaping_key | noentityescaping_key )?
                    int alt255=3;
                    int LA255_0 = input.LA(1);

                    if ( (LA255_0==REGULAR_ID) ) {
                        int LA255_1 = input.LA(2);

                        if ( ((input.LT(1).getText().equalsIgnoreCase("entityescaping"))) ) {
                            alt255=1;
                        }
                        else if ( ((input.LT(1).getText().equalsIgnoreCase("noentityescaping"))) ) {
                            alt255=2;
                        }
                    }
                    switch (alt255) {
                        case 1 :
                            // PLSQL_DMLParser.g:1102:18: entityescaping_key
                            {
                            pushFollow(FOLLOW_entityescaping_key_in_standard_function11064);
                            entityescaping_key819=gPLSQLParser.entityescaping_key();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) adaptor.addChild(root_0, entityescaping_key819.getTree());

                            }
                            break;
                        case 2 :
                            // PLSQL_DMLParser.g:1102:37: noentityescaping_key
                            {
                            pushFollow(FOLLOW_noentityescaping_key_in_standard_function11066);
                            noentityescaping_key820=gPLSQLParser.noentityescaping_key();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) adaptor.addChild(root_0, noentityescaping_key820.getTree());

                            }
                            break;

                    }


                    // PLSQL_DMLParser.g:1103:17: ( name_key | evalname_key )?
                    int alt256=3;
                    int LA256_0 = input.LA(1);

                    if ( (LA256_0==REGULAR_ID) ) {
                        int LA256_1 = input.LA(2);

                        if ( ((input.LT(1).getText().equalsIgnoreCase("name"))) ) {
                            alt256=1;
                        }
                        else if ( ((input.LT(1).getText().equalsIgnoreCase("evalname"))) ) {
                            alt256=2;
                        }
                    }
                    switch (alt256) {
                        case 1 :
                            // PLSQL_DMLParser.g:1103:18: name_key
                            {
                            pushFollow(FOLLOW_name_key_in_standard_function11087);
                            name_key821=gPLSQLParser.name_key();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) adaptor.addChild(root_0, name_key821.getTree());

                            }
                            break;
                        case 2 :
                            // PLSQL_DMLParser.g:1103:27: evalname_key
                            {
                            pushFollow(FOLLOW_evalname_key_in_standard_function11089);
                            evalname_key822=gPLSQLParser.evalname_key();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) adaptor.addChild(root_0, evalname_key822.getTree());

                            }
                            break;

                    }


                    pushFollow(FOLLOW_expression_wrapper_in_standard_function11093);
                    expression_wrapper823=expression_wrapper();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, expression_wrapper823.getTree());

                    // PLSQL_DMLParser.g:1104:17: ({...}? COMMA ! xml_attributes_clause )?
                    int alt257=2;
                    int LA257_0 = input.LA(1);

                    if ( (LA257_0==COMMA) ) {
                        int LA257_1 = input.LA(2);

                        if ( ((input.LT(2).getText().equalsIgnoreCase("xmlattributes"))) ) {
                            alt257=1;
                        }
                    }
                    switch (alt257) {
                        case 1 :
                            // PLSQL_DMLParser.g:1104:18: {...}? COMMA ! xml_attributes_clause
                            {
                            if ( !((input.LT(2).getText().equalsIgnoreCase("xmlattributes"))) ) {
                                if (state.backtracking>0) {state.failed=true; return retval;}
                                throw new FailedPredicateException(input, "standard_function", "input.LT(2).getText().equalsIgnoreCase(\"xmlattributes\")");
                            }

                            COMMA824=(Token)match(input,COMMA,FOLLOW_COMMA_in_standard_function11114); if (state.failed) return retval;

                            pushFollow(FOLLOW_xml_attributes_clause_in_standard_function11117);
                            xml_attributes_clause825=xml_attributes_clause();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) adaptor.addChild(root_0, xml_attributes_clause825.getTree());

                            }
                            break;

                    }


                    // PLSQL_DMLParser.g:1105:17: ( COMMA ! expression_wrapper ( alias )? )*
                    loop259:
                    do {
                        int alt259=2;
                        int LA259_0 = input.LA(1);

                        if ( (LA259_0==COMMA) ) {
                            alt259=1;
                        }


                        switch (alt259) {
                    	case 1 :
                    	    // PLSQL_DMLParser.g:1105:18: COMMA ! expression_wrapper ( alias )?
                    	    {
                    	    COMMA826=(Token)match(input,COMMA,FOLLOW_COMMA_in_standard_function11138); if (state.failed) return retval;

                    	    pushFollow(FOLLOW_expression_wrapper_in_standard_function11141);
                    	    expression_wrapper827=expression_wrapper();

                    	    state._fsp--;
                    	    if (state.failed) return retval;
                    	    if ( state.backtracking==0 ) adaptor.addChild(root_0, expression_wrapper827.getTree());

                    	    // PLSQL_DMLParser.g:1105:44: ( alias )?
                    	    int alt258=2;
                    	    int LA258_0 = input.LA(1);

                    	    if ( (LA258_0==CHAR_STRING||LA258_0==DELIMITED_ID||LA258_0==INTRODUCER||LA258_0==REGULAR_ID||LA258_0==SQL92_RESERVED_AS) ) {
                    	        alt258=1;
                    	    }
                    	    switch (alt258) {
                    	        case 1 :
                    	            // PLSQL_DMLParser.g:1105:44: alias
                    	            {
                    	            pushFollow(FOLLOW_alias_in_standard_function11143);
                    	            alias828=gPLSQLParser.alias();

                    	            state._fsp--;
                    	            if (state.failed) return retval;
                    	            if ( state.backtracking==0 ) adaptor.addChild(root_0, alias828.getTree());

                    	            }
                    	            break;

                    	    }


                    	    }
                    	    break;

                    	default :
                    	    break loop259;
                        }
                    } while (true);


                    RIGHT_PAREN829=(Token)match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_standard_function11160); if (state.failed) return retval;

                    }
                    break;
                case 18 :
                    // PLSQL_DMLParser.g:1107:10: xmlexists_key ^ LEFT_PAREN ! expression_wrapper ( xml_passing_clause )? RIGHT_PAREN !
                    {
                    root_0 = (Object)adaptor.nil();


                    pushFollow(FOLLOW_xmlexists_key_in_standard_function11172);
                    xmlexists_key830=gPLSQLParser.xmlexists_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) root_0 = (Object)adaptor.becomeRoot(xmlexists_key830.getTree(), root_0);

                    LEFT_PAREN831=(Token)match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_standard_function11187); if (state.failed) return retval;

                    pushFollow(FOLLOW_expression_wrapper_in_standard_function11206);
                    expression_wrapper832=expression_wrapper();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, expression_wrapper832.getTree());

                    // PLSQL_DMLParser.g:1110:17: ( xml_passing_clause )?
                    int alt260=2;
                    int LA260_0 = input.LA(1);

                    if ( (LA260_0==REGULAR_ID) && ((input.LT(1).getText().equalsIgnoreCase("passing")))) {
                        alt260=1;
                    }
                    switch (alt260) {
                        case 1 :
                            // PLSQL_DMLParser.g:1110:17: xml_passing_clause
                            {
                            pushFollow(FOLLOW_xml_passing_clause_in_standard_function11224);
                            xml_passing_clause833=xml_passing_clause();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) adaptor.addChild(root_0, xml_passing_clause833.getTree());

                            }
                            break;

                    }


                    RIGHT_PAREN834=(Token)match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_standard_function11239); if (state.failed) return retval;

                    }
                    break;
                case 19 :
                    // PLSQL_DMLParser.g:1112:10: xmlparse_key ^ LEFT_PAREN ! ( document_key | content_key ) concatenation_wrapper ( wellformed_key )? RIGHT_PAREN !
                    {
                    root_0 = (Object)adaptor.nil();


                    pushFollow(FOLLOW_xmlparse_key_in_standard_function11251);
                    xmlparse_key835=gPLSQLParser.xmlparse_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) root_0 = (Object)adaptor.becomeRoot(xmlparse_key835.getTree(), root_0);

                    LEFT_PAREN836=(Token)match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_standard_function11266); if (state.failed) return retval;

                    // PLSQL_DMLParser.g:1114:17: ( document_key | content_key )
                    int alt261=2;
                    int LA261_0 = input.LA(1);

                    if ( (LA261_0==REGULAR_ID) && (((input.LT(1).getText().equalsIgnoreCase("document"))||(input.LT(1).getText().equalsIgnoreCase("content"))))) {
                        int LA261_1 = input.LA(2);

                        if ( ((input.LT(1).getText().equalsIgnoreCase("document"))) ) {
                            alt261=1;
                        }
                        else if ( ((input.LT(1).getText().equalsIgnoreCase("content"))) ) {
                            alt261=2;
                        }
                        else {
                            if (state.backtracking>0) {state.failed=true; return retval;}
                            NoViableAltException nvae =
                                new NoViableAltException("", 261, 1, input);

                            throw nvae;

                        }
                    }
                    else {
                        if (state.backtracking>0) {state.failed=true; return retval;}
                        NoViableAltException nvae =
                            new NoViableAltException("", 261, 0, input);

                        throw nvae;

                    }
                    switch (alt261) {
                        case 1 :
                            // PLSQL_DMLParser.g:1114:18: document_key
                            {
                            pushFollow(FOLLOW_document_key_in_standard_function11287);
                            document_key837=gPLSQLParser.document_key();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) adaptor.addChild(root_0, document_key837.getTree());

                            }
                            break;
                        case 2 :
                            // PLSQL_DMLParser.g:1114:31: content_key
                            {
                            pushFollow(FOLLOW_content_key_in_standard_function11289);
                            content_key838=gPLSQLParser.content_key();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) adaptor.addChild(root_0, content_key838.getTree());

                            }
                            break;

                    }


                    pushFollow(FOLLOW_concatenation_wrapper_in_standard_function11292);
                    concatenation_wrapper839=concatenation_wrapper();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, concatenation_wrapper839.getTree());

                    // PLSQL_DMLParser.g:1114:66: ( wellformed_key )?
                    int alt262=2;
                    int LA262_0 = input.LA(1);

                    if ( (LA262_0==REGULAR_ID) && ((input.LT(1).getText().equalsIgnoreCase("wellformed")))) {
                        alt262=1;
                    }
                    switch (alt262) {
                        case 1 :
                            // PLSQL_DMLParser.g:1114:66: wellformed_key
                            {
                            pushFollow(FOLLOW_wellformed_key_in_standard_function11294);
                            wellformed_key840=gPLSQLParser.wellformed_key();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) adaptor.addChild(root_0, wellformed_key840.getTree());

                            }
                            break;

                    }


                    RIGHT_PAREN841=(Token)match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_standard_function11309); if (state.failed) return retval;

                    }
                    break;
                case 20 :
                    // PLSQL_DMLParser.g:1116:10: xmlpi_key ^ LEFT_PAREN ! ( name_key id | evalname_key concatenation_wrapper ) ( COMMA ! concatenation_wrapper )? RIGHT_PAREN !
                    {
                    root_0 = (Object)adaptor.nil();


                    pushFollow(FOLLOW_xmlpi_key_in_standard_function11321);
                    xmlpi_key842=gPLSQLParser.xmlpi_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) root_0 = (Object)adaptor.becomeRoot(xmlpi_key842.getTree(), root_0);

                    LEFT_PAREN843=(Token)match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_standard_function11336); if (state.failed) return retval;

                    // PLSQL_DMLParser.g:1118:17: ( name_key id | evalname_key concatenation_wrapper )
                    int alt263=2;
                    alt263 = dfa263.predict(input);
                    switch (alt263) {
                        case 1 :
                            // PLSQL_DMLParser.g:1118:22: name_key id
                            {
                            pushFollow(FOLLOW_name_key_in_standard_function11361);
                            name_key844=gPLSQLParser.name_key();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) adaptor.addChild(root_0, name_key844.getTree());

                            pushFollow(FOLLOW_id_in_standard_function11363);
                            id845=gPLSQLParser.id();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) adaptor.addChild(root_0, id845.getTree());

                            }
                            break;
                        case 2 :
                            // PLSQL_DMLParser.g:1119:22: evalname_key concatenation_wrapper
                            {
                            pushFollow(FOLLOW_evalname_key_in_standard_function11386);
                            evalname_key846=gPLSQLParser.evalname_key();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) adaptor.addChild(root_0, evalname_key846.getTree());

                            pushFollow(FOLLOW_concatenation_wrapper_in_standard_function11388);
                            concatenation_wrapper847=concatenation_wrapper();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) adaptor.addChild(root_0, concatenation_wrapper847.getTree());

                            }
                            break;

                    }


                    // PLSQL_DMLParser.g:1121:17: ( COMMA ! concatenation_wrapper )?
                    int alt264=2;
                    int LA264_0 = input.LA(1);

                    if ( (LA264_0==COMMA) ) {
                        alt264=1;
                    }
                    switch (alt264) {
                        case 1 :
                            // PLSQL_DMLParser.g:1121:18: COMMA ! concatenation_wrapper
                            {
                            COMMA848=(Token)match(input,COMMA,FOLLOW_COMMA_in_standard_function11425); if (state.failed) return retval;

                            pushFollow(FOLLOW_concatenation_wrapper_in_standard_function11428);
                            concatenation_wrapper849=concatenation_wrapper();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) adaptor.addChild(root_0, concatenation_wrapper849.getTree());

                            }
                            break;

                    }


                    RIGHT_PAREN850=(Token)match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_standard_function11444); if (state.failed) return retval;

                    }
                    break;
                case 21 :
                    // PLSQL_DMLParser.g:1123:10: xmlquery_key ^ LEFT_PAREN ! concatenation_wrapper ( xml_passing_clause )? returning_key ! content_key ! ( null_key on_key ! empty_key !)? RIGHT_PAREN !
                    {
                    root_0 = (Object)adaptor.nil();


                    pushFollow(FOLLOW_xmlquery_key_in_standard_function11456);
                    xmlquery_key851=gPLSQLParser.xmlquery_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) root_0 = (Object)adaptor.becomeRoot(xmlquery_key851.getTree(), root_0);

                    LEFT_PAREN852=(Token)match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_standard_function11471); if (state.failed) return retval;

                    pushFollow(FOLLOW_concatenation_wrapper_in_standard_function11491);
                    concatenation_wrapper853=concatenation_wrapper();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, concatenation_wrapper853.getTree());

                    // PLSQL_DMLParser.g:1125:39: ( xml_passing_clause )?
                    int alt265=2;
                    int LA265_0 = input.LA(1);

                    if ( (LA265_0==REGULAR_ID) && (((input.LT(1).getText().equalsIgnoreCase("returning"))||(input.LT(1).getText().equalsIgnoreCase("passing"))))) {
                        int LA265_1 = input.LA(2);

                        if ( (LA265_1==APPROXIMATE_NUM_LIT||(LA265_1 >= CHAR_STRING && LA265_1 <= COLON)||LA265_1==DELIMITED_ID||LA265_1==EXACT_NUM_LIT||LA265_1==INTRODUCER||LA265_1==LEFT_PAREN||LA265_1==MINUS_SIGN||LA265_1==PLUS_SIGN||LA265_1==SQL92_RESERVED_ALL||LA265_1==SQL92_RESERVED_ANY||(LA265_1 >= SQL92_RESERVED_BY && LA265_1 <= SQL92_RESERVED_CASE)||LA265_1==SQL92_RESERVED_DEFAULT||LA265_1==SQL92_RESERVED_DISTINCT||(LA265_1 >= SQL92_RESERVED_EXISTS && LA265_1 <= SQL92_RESERVED_FALSE)||(LA265_1 >= SQL92_RESERVED_NOT && LA265_1 <= SQL92_RESERVED_NULL)||LA265_1==SQL92_RESERVED_PRIOR||LA265_1==SQL92_RESERVED_TRUE||LA265_1==UNSIGNED_INTEGER) && ((input.LT(1).getText().equalsIgnoreCase("passing")))) {
                            alt265=1;
                        }
                        else if ( (LA265_1==REGULAR_ID) && (((input.LT(1).getText().equalsIgnoreCase("returning"))||(input.LT(1).getText().equalsIgnoreCase("passing"))))) {
                            int LA265_3 = input.LA(3);

                            if ( (LA265_3==APPROXIMATE_NUM_LIT||LA265_3==ASTERISK||(LA265_3 >= CHAR_STRING && LA265_3 <= COMMA)||(LA265_3 >= CONCATENATION_OP && LA265_3 <= DELIMITED_ID)||(LA265_3 >= EQUALS_OP && LA265_3 <= EXACT_NUM_LIT)||(LA265_3 >= GREATER_THAN_OP && LA265_3 <= GREATER_THAN_OR_EQUALS_OP)||(LA265_3 >= INTRODUCER && LA265_3 <= MINUS_SIGN)||LA265_3==NOT_EQUAL_OP||LA265_3==PERIOD||LA265_3==PLUS_SIGN||LA265_3==REGULAR_ID||LA265_3==SOLIDUS||LA265_3==SQL92_RESERVED_ALL||(LA265_3 >= SQL92_RESERVED_AND && LA265_3 <= SQL92_RESERVED_AS)||LA265_3==SQL92_RESERVED_BETWEEN||LA265_3==SQL92_RESERVED_CASE||LA265_3==SQL92_RESERVED_DEFAULT||LA265_3==SQL92_RESERVED_DISTINCT||(LA265_3 >= SQL92_RESERVED_EXISTS && LA265_3 <= SQL92_RESERVED_FALSE)||LA265_3==SQL92_RESERVED_IN||(LA265_3 >= SQL92_RESERVED_IS && LA265_3 <= SQL92_RESERVED_NOT)||LA265_3==SQL92_RESERVED_OR||LA265_3==SQL92_RESERVED_PRIOR||LA265_3==SQL92_RESERVED_TRUE||LA265_3==UNSIGNED_INTEGER) && ((input.LT(1).getText().equalsIgnoreCase("passing")))) {
                                alt265=1;
                            }
                            else if ( (LA265_3==SQL92_RESERVED_NULL) && (((input.LT(1).getText().equalsIgnoreCase("returning"))||(input.LT(1).getText().equalsIgnoreCase("passing"))))) {
                                int LA265_4 = input.LA(4);

                                if ( (LA265_4==ASTERISK||LA265_4==CHAR_STRING||LA265_4==COMMA||(LA265_4 >= CONCATENATION_OP && LA265_4 <= DELIMITED_ID)||LA265_4==EQUALS_OP||(LA265_4 >= GREATER_THAN_OP && LA265_4 <= GREATER_THAN_OR_EQUALS_OP)||(LA265_4 >= INTRODUCER && LA265_4 <= LEFT_BRACKET)||(LA265_4 >= LESS_THAN_OP && LA265_4 <= MINUS_SIGN)||LA265_4==NOT_EQUAL_OP||LA265_4==PLUS_SIGN||LA265_4==REGULAR_ID||LA265_4==SOLIDUS||LA265_4==SQL92_RESERVED_AND||LA265_4==SQL92_RESERVED_AS||LA265_4==SQL92_RESERVED_BETWEEN||LA265_4==SQL92_RESERVED_IN||(LA265_4 >= SQL92_RESERVED_IS && LA265_4 <= SQL92_RESERVED_NOT)||LA265_4==SQL92_RESERVED_OR) && ((input.LT(1).getText().equalsIgnoreCase("passing")))) {
                                    alt265=1;
                                }
                            }
                        }
                    }
                    switch (alt265) {
                        case 1 :
                            // PLSQL_DMLParser.g:1125:39: xml_passing_clause
                            {
                            pushFollow(FOLLOW_xml_passing_clause_in_standard_function11493);
                            xml_passing_clause854=xml_passing_clause();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) adaptor.addChild(root_0, xml_passing_clause854.getTree());

                            }
                            break;

                    }


                    pushFollow(FOLLOW_returning_key_in_standard_function11512);
                    returning_key855=gPLSQLParser.returning_key();

                    state._fsp--;
                    if (state.failed) return retval;

                    pushFollow(FOLLOW_content_key_in_standard_function11515);
                    content_key856=gPLSQLParser.content_key();

                    state._fsp--;
                    if (state.failed) return retval;

                    // PLSQL_DMLParser.g:1126:45: ( null_key on_key ! empty_key !)?
                    int alt266=2;
                    int LA266_0 = input.LA(1);

                    if ( (LA266_0==SQL92_RESERVED_NULL) ) {
                        alt266=1;
                    }
                    switch (alt266) {
                        case 1 :
                            // PLSQL_DMLParser.g:1126:46: null_key on_key ! empty_key !
                            {
                            pushFollow(FOLLOW_null_key_in_standard_function11519);
                            null_key857=gPLSQLParser.null_key();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) adaptor.addChild(root_0, null_key857.getTree());

                            pushFollow(FOLLOW_on_key_in_standard_function11521);
                            on_key858=gPLSQLParser.on_key();

                            state._fsp--;
                            if (state.failed) return retval;

                            pushFollow(FOLLOW_empty_key_in_standard_function11524);
                            empty_key859=gPLSQLParser.empty_key();

                            state._fsp--;
                            if (state.failed) return retval;

                            }
                            break;

                    }


                    RIGHT_PAREN860=(Token)match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_standard_function11541); if (state.failed) return retval;

                    }
                    break;
                case 22 :
                    // PLSQL_DMLParser.g:1128:10: xmlroot_key ^ LEFT_PAREN ! concatenation_wrapper xmlroot_param_version_part ( COMMA ! xmlroot_param_standalone_part )? RIGHT_PAREN !
                    {
                    root_0 = (Object)adaptor.nil();


                    pushFollow(FOLLOW_xmlroot_key_in_standard_function11553);
                    xmlroot_key861=gPLSQLParser.xmlroot_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) root_0 = (Object)adaptor.becomeRoot(xmlroot_key861.getTree(), root_0);

                    LEFT_PAREN862=(Token)match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_standard_function11568); if (state.failed) return retval;

                    pushFollow(FOLLOW_concatenation_wrapper_in_standard_function11587);
                    concatenation_wrapper863=concatenation_wrapper();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, concatenation_wrapper863.getTree());

                    pushFollow(FOLLOW_xmlroot_param_version_part_in_standard_function11609);
                    xmlroot_param_version_part864=xmlroot_param_version_part();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, xmlroot_param_version_part864.getTree());

                    // PLSQL_DMLParser.g:1132:21: ( COMMA ! xmlroot_param_standalone_part )?
                    int alt267=2;
                    int LA267_0 = input.LA(1);

                    if ( (LA267_0==COMMA) ) {
                        alt267=1;
                    }
                    switch (alt267) {
                        case 1 :
                            // PLSQL_DMLParser.g:1132:22: COMMA ! xmlroot_param_standalone_part
                            {
                            COMMA865=(Token)match(input,COMMA,FOLLOW_COMMA_in_standard_function11632); if (state.failed) return retval;

                            pushFollow(FOLLOW_xmlroot_param_standalone_part_in_standard_function11635);
                            xmlroot_param_standalone_part866=xmlroot_param_standalone_part();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) adaptor.addChild(root_0, xmlroot_param_standalone_part866.getTree());

                            }
                            break;

                    }


                    RIGHT_PAREN867=(Token)match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_standard_function11651); if (state.failed) return retval;

                    }
                    break;
                case 23 :
                    // PLSQL_DMLParser.g:1134:10: xmlserialize_key ^ LEFT_PAREN ! ( document_key | content_key ) concatenation_wrapper ( as_key ! type_spec )? ( xmlserialize_param_enconding_part )? ( xmlserialize_param_version_part )? ( xmlserialize_param_ident_part )? ( ( hide_key | show_key ) defaults_key )? RIGHT_PAREN !
                    {
                    root_0 = (Object)adaptor.nil();


                    pushFollow(FOLLOW_xmlserialize_key_in_standard_function11663);
                    xmlserialize_key868=gPLSQLParser.xmlserialize_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) root_0 = (Object)adaptor.becomeRoot(xmlserialize_key868.getTree(), root_0);

                    LEFT_PAREN869=(Token)match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_standard_function11678); if (state.failed) return retval;

                    // PLSQL_DMLParser.g:1136:17: ( document_key | content_key )
                    int alt268=2;
                    int LA268_0 = input.LA(1);

                    if ( (LA268_0==REGULAR_ID) && (((input.LT(1).getText().equalsIgnoreCase("document"))||(input.LT(1).getText().equalsIgnoreCase("content"))))) {
                        int LA268_1 = input.LA(2);

                        if ( ((input.LT(1).getText().equalsIgnoreCase("document"))) ) {
                            alt268=1;
                        }
                        else if ( ((input.LT(1).getText().equalsIgnoreCase("content"))) ) {
                            alt268=2;
                        }
                        else {
                            if (state.backtracking>0) {state.failed=true; return retval;}
                            NoViableAltException nvae =
                                new NoViableAltException("", 268, 1, input);

                            throw nvae;

                        }
                    }
                    else {
                        if (state.backtracking>0) {state.failed=true; return retval;}
                        NoViableAltException nvae =
                            new NoViableAltException("", 268, 0, input);

                        throw nvae;

                    }
                    switch (alt268) {
                        case 1 :
                            // PLSQL_DMLParser.g:1136:18: document_key
                            {
                            pushFollow(FOLLOW_document_key_in_standard_function11698);
                            document_key870=gPLSQLParser.document_key();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) adaptor.addChild(root_0, document_key870.getTree());

                            }
                            break;
                        case 2 :
                            // PLSQL_DMLParser.g:1136:31: content_key
                            {
                            pushFollow(FOLLOW_content_key_in_standard_function11700);
                            content_key871=gPLSQLParser.content_key();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) adaptor.addChild(root_0, content_key871.getTree());

                            }
                            break;

                    }


                    pushFollow(FOLLOW_concatenation_wrapper_in_standard_function11719);
                    concatenation_wrapper872=concatenation_wrapper();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, concatenation_wrapper872.getTree());

                    // PLSQL_DMLParser.g:1137:39: ( as_key ! type_spec )?
                    int alt269=2;
                    int LA269_0 = input.LA(1);

                    if ( (LA269_0==SQL92_RESERVED_AS) ) {
                        alt269=1;
                    }
                    switch (alt269) {
                        case 1 :
                            // PLSQL_DMLParser.g:1137:40: as_key ! type_spec
                            {
                            pushFollow(FOLLOW_as_key_in_standard_function11722);
                            as_key873=gPLSQLParser.as_key();

                            state._fsp--;
                            if (state.failed) return retval;

                            pushFollow(FOLLOW_type_spec_in_standard_function11725);
                            type_spec874=gPLSQLParser.type_spec();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) adaptor.addChild(root_0, type_spec874.getTree());

                            }
                            break;

                    }


                    // PLSQL_DMLParser.g:1138:17: ( xmlserialize_param_enconding_part )?
                    int alt270=2;
                    int LA270_0 = input.LA(1);

                    if ( (LA270_0==REGULAR_ID) && (((input.LT(1).getText().equalsIgnoreCase("no"))||(input.LT(1).getText().equalsIgnoreCase("encoding"))||(input.LT(1).getText().equalsIgnoreCase("indent"))||(input.LT(1).getText().equalsIgnoreCase("version"))||(input.LT(1).getText().equalsIgnoreCase("hide"))||(input.LT(1).getText().equalsIgnoreCase("show"))))) {
                        int LA270_1 = input.LA(2);

                        if ( ((input.LT(1).getText().equalsIgnoreCase("encoding"))) ) {
                            alt270=1;
                        }
                    }
                    switch (alt270) {
                        case 1 :
                            // PLSQL_DMLParser.g:1138:17: xmlserialize_param_enconding_part
                            {
                            pushFollow(FOLLOW_xmlserialize_param_enconding_part_in_standard_function11745);
                            xmlserialize_param_enconding_part875=xmlserialize_param_enconding_part();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) adaptor.addChild(root_0, xmlserialize_param_enconding_part875.getTree());

                            }
                            break;

                    }


                    // PLSQL_DMLParser.g:1139:17: ( xmlserialize_param_version_part )?
                    int alt271=2;
                    int LA271_0 = input.LA(1);

                    if ( (LA271_0==REGULAR_ID) && (((input.LT(1).getText().equalsIgnoreCase("no"))||(input.LT(1).getText().equalsIgnoreCase("indent"))||(input.LT(1).getText().equalsIgnoreCase("version"))||(input.LT(1).getText().equalsIgnoreCase("hide"))||(input.LT(1).getText().equalsIgnoreCase("show"))))) {
                        int LA271_1 = input.LA(2);

                        if ( (LA271_1==APPROXIMATE_NUM_LIT||(LA271_1 >= CHAR_STRING && LA271_1 <= COLON)||LA271_1==DELIMITED_ID||LA271_1==EXACT_NUM_LIT||LA271_1==INTRODUCER||LA271_1==LEFT_PAREN||LA271_1==MINUS_SIGN||LA271_1==PLUS_SIGN||LA271_1==SQL92_RESERVED_ALL||LA271_1==SQL92_RESERVED_ANY||LA271_1==SQL92_RESERVED_CASE||LA271_1==SQL92_RESERVED_DEFAULT||LA271_1==SQL92_RESERVED_DISTINCT||(LA271_1 >= SQL92_RESERVED_EXISTS && LA271_1 <= SQL92_RESERVED_FALSE)||LA271_1==SQL92_RESERVED_NULL||LA271_1==SQL92_RESERVED_PRIOR||LA271_1==SQL92_RESERVED_TRUE||LA271_1==UNSIGNED_INTEGER) && ((input.LT(1).getText().equalsIgnoreCase("version")))) {
                            alt271=1;
                        }
                        else if ( (LA271_1==REGULAR_ID) && (((input.LT(1).getText().equalsIgnoreCase("no"))||(input.LT(1).getText().equalsIgnoreCase("indent"))||(input.LT(1).getText().equalsIgnoreCase("version"))||(input.LT(1).getText().equalsIgnoreCase("hide"))||(input.LT(1).getText().equalsIgnoreCase("show"))))) {
                            int LA271_4 = input.LA(3);

                            if ( ((input.LT(1).getText().equalsIgnoreCase("version"))) ) {
                                alt271=1;
                            }
                        }
                    }
                    switch (alt271) {
                        case 1 :
                            // PLSQL_DMLParser.g:1139:17: xmlserialize_param_version_part
                            {
                            pushFollow(FOLLOW_xmlserialize_param_version_part_in_standard_function11764);
                            xmlserialize_param_version_part876=xmlserialize_param_version_part();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) adaptor.addChild(root_0, xmlserialize_param_version_part876.getTree());

                            }
                            break;

                    }


                    // PLSQL_DMLParser.g:1140:17: ( xmlserialize_param_ident_part )?
                    int alt272=2;
                    int LA272_0 = input.LA(1);

                    if ( (LA272_0==REGULAR_ID) && (((input.LT(1).getText().equalsIgnoreCase("no"))||(input.LT(1).getText().equalsIgnoreCase("indent"))||(input.LT(1).getText().equalsIgnoreCase("hide"))||(input.LT(1).getText().equalsIgnoreCase("show"))))) {
                        int LA272_1 = input.LA(2);

                        if ( (LA272_1==REGULAR_ID) && (((input.LT(1).getText().equalsIgnoreCase("no"))||(input.LT(1).getText().equalsIgnoreCase("indent"))||(input.LT(1).getText().equalsIgnoreCase("hide"))||(input.LT(1).getText().equalsIgnoreCase("show"))))) {
                            int LA272_3 = input.LA(3);

                            if ( (((input.LT(1).getText().equalsIgnoreCase("no"))||(input.LT(1).getText().equalsIgnoreCase("indent")))) ) {
                                alt272=1;
                            }
                        }
                        else if ( (LA272_1==RIGHT_PAREN||LA272_1==SQL92_RESERVED_SIZE) && ((input.LT(1).getText().equalsIgnoreCase("indent")))) {
                            alt272=1;
                        }
                    }
                    switch (alt272) {
                        case 1 :
                            // PLSQL_DMLParser.g:1140:17: xmlserialize_param_ident_part
                            {
                            pushFollow(FOLLOW_xmlserialize_param_ident_part_in_standard_function11783);
                            xmlserialize_param_ident_part877=xmlserialize_param_ident_part();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) adaptor.addChild(root_0, xmlserialize_param_ident_part877.getTree());

                            }
                            break;

                    }


                    // PLSQL_DMLParser.g:1141:17: ( ( hide_key | show_key ) defaults_key )?
                    int alt274=2;
                    int LA274_0 = input.LA(1);

                    if ( (LA274_0==REGULAR_ID) && (((input.LT(1).getText().equalsIgnoreCase("hide"))||(input.LT(1).getText().equalsIgnoreCase("show"))))) {
                        alt274=1;
                    }
                    switch (alt274) {
                        case 1 :
                            // PLSQL_DMLParser.g:1141:18: ( hide_key | show_key ) defaults_key
                            {
                            // PLSQL_DMLParser.g:1141:18: ( hide_key | show_key )
                            int alt273=2;
                            int LA273_0 = input.LA(1);

                            if ( (LA273_0==REGULAR_ID) && (((input.LT(1).getText().equalsIgnoreCase("hide"))||(input.LT(1).getText().equalsIgnoreCase("show"))))) {
                                int LA273_1 = input.LA(2);

                                if ( ((input.LT(1).getText().equalsIgnoreCase("hide"))) ) {
                                    alt273=1;
                                }
                                else if ( ((input.LT(1).getText().equalsIgnoreCase("show"))) ) {
                                    alt273=2;
                                }
                                else {
                                    if (state.backtracking>0) {state.failed=true; return retval;}
                                    NoViableAltException nvae =
                                        new NoViableAltException("", 273, 1, input);

                                    throw nvae;

                                }
                            }
                            else {
                                if (state.backtracking>0) {state.failed=true; return retval;}
                                NoViableAltException nvae =
                                    new NoViableAltException("", 273, 0, input);

                                throw nvae;

                            }
                            switch (alt273) {
                                case 1 :
                                    // PLSQL_DMLParser.g:1141:19: hide_key
                                    {
                                    pushFollow(FOLLOW_hide_key_in_standard_function11804);
                                    hide_key878=gPLSQLParser.hide_key();

                                    state._fsp--;
                                    if (state.failed) return retval;
                                    if ( state.backtracking==0 ) adaptor.addChild(root_0, hide_key878.getTree());

                                    }
                                    break;
                                case 2 :
                                    // PLSQL_DMLParser.g:1141:28: show_key
                                    {
                                    pushFollow(FOLLOW_show_key_in_standard_function11806);
                                    show_key879=gPLSQLParser.show_key();

                                    state._fsp--;
                                    if (state.failed) return retval;
                                    if ( state.backtracking==0 ) adaptor.addChild(root_0, show_key879.getTree());

                                    }
                                    break;

                            }


                            pushFollow(FOLLOW_defaults_key_in_standard_function11809);
                            defaults_key880=gPLSQLParser.defaults_key();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) adaptor.addChild(root_0, defaults_key880.getTree());

                            }
                            break;

                    }


                    RIGHT_PAREN881=(Token)match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_standard_function11825); if (state.failed) return retval;

                    }
                    break;
                case 24 :
                    // PLSQL_DMLParser.g:1143:10: xmltable_key ^ LEFT_PAREN ! ( xml_namespaces_clause )? concatenation_wrapper ( xml_passing_clause )? ( columns_key ! xml_table_column ( COMMA ! xml_table_column ) )? RIGHT_PAREN !
                    {
                    root_0 = (Object)adaptor.nil();


                    pushFollow(FOLLOW_xmltable_key_in_standard_function11837);
                    xmltable_key882=gPLSQLParser.xmltable_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) root_0 = (Object)adaptor.becomeRoot(xmltable_key882.getTree(), root_0);

                    LEFT_PAREN883=(Token)match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_standard_function11852); if (state.failed) return retval;

                    // PLSQL_DMLParser.g:1145:17: ( xml_namespaces_clause )?
                    int alt275=2;
                    int LA275_0 = input.LA(1);

                    if ( (LA275_0==REGULAR_ID) ) {
                        int LA275_1 = input.LA(2);

                        if ( ((input.LT(1).getText().equalsIgnoreCase("xmlnamespaces"))) ) {
                            alt275=1;
                        }
                    }
                    switch (alt275) {
                        case 1 :
                            // PLSQL_DMLParser.g:1145:17: xml_namespaces_clause
                            {
                            pushFollow(FOLLOW_xml_namespaces_clause_in_standard_function11871);
                            xml_namespaces_clause884=xml_namespaces_clause();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) adaptor.addChild(root_0, xml_namespaces_clause884.getTree());

                            }
                            break;

                    }


                    pushFollow(FOLLOW_concatenation_wrapper_in_standard_function11890);
                    concatenation_wrapper885=concatenation_wrapper();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, concatenation_wrapper885.getTree());

                    // PLSQL_DMLParser.g:1147:17: ( xml_passing_clause )?
                    int alt276=2;
                    int LA276_0 = input.LA(1);

                    if ( (LA276_0==REGULAR_ID) && ((input.LT(1).getText().equalsIgnoreCase("passing")))) {
                        alt276=1;
                    }
                    switch (alt276) {
                        case 1 :
                            // PLSQL_DMLParser.g:1147:17: xml_passing_clause
                            {
                            pushFollow(FOLLOW_xml_passing_clause_in_standard_function11908);
                            xml_passing_clause886=xml_passing_clause();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) adaptor.addChild(root_0, xml_passing_clause886.getTree());

                            }
                            break;

                    }


                    // PLSQL_DMLParser.g:1148:17: ( columns_key ! xml_table_column ( COMMA ! xml_table_column ) )?
                    int alt277=2;
                    int LA277_0 = input.LA(1);

                    if ( (LA277_0==PLSQL_RESERVED_COLUMNS) ) {
                        alt277=1;
                    }
                    switch (alt277) {
                        case 1 :
                            // PLSQL_DMLParser.g:1148:18: columns_key ! xml_table_column ( COMMA ! xml_table_column )
                            {
                            pushFollow(FOLLOW_columns_key_in_standard_function11928);
                            columns_key887=gPLSQLParser.columns_key();

                            state._fsp--;
                            if (state.failed) return retval;

                            pushFollow(FOLLOW_xml_table_column_in_standard_function11931);
                            xml_table_column888=xml_table_column();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) adaptor.addChild(root_0, xml_table_column888.getTree());

                            // PLSQL_DMLParser.g:1148:48: ( COMMA ! xml_table_column )
                            // PLSQL_DMLParser.g:1148:49: COMMA ! xml_table_column
                            {
                            COMMA889=(Token)match(input,COMMA,FOLLOW_COMMA_in_standard_function11934); if (state.failed) return retval;

                            pushFollow(FOLLOW_xml_table_column_in_standard_function11937);
                            xml_table_column890=xml_table_column();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) adaptor.addChild(root_0, xml_table_column890.getTree());

                            }


                            }
                            break;

                    }


                    RIGHT_PAREN891=(Token)match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_standard_function11954); if (state.failed) return retval;

                    }
                    break;

            }
            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "standard_function"


    public static class stantard_function_enabling_over_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "stantard_function_enabling_over"
    // PLSQL_DMLParser.g:1152:1: stantard_function_enabling_over :{...}? => REGULAR_ID -> FUNCTION_ENABLING_OVER[$REGULAR_ID] ;
    public final PLSQLParser_PLSQL_DMLParser.stantard_function_enabling_over_return stantard_function_enabling_over() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.stantard_function_enabling_over_return retval = new PLSQLParser_PLSQL_DMLParser.stantard_function_enabling_over_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token REGULAR_ID892=null;

        Object REGULAR_ID892_tree=null;
        RewriteRuleTokenStream stream_REGULAR_ID=new RewriteRuleTokenStream(adaptor,"token REGULAR_ID");

        try {
            // PLSQL_DMLParser.g:1153:5: ({...}? => REGULAR_ID -> FUNCTION_ENABLING_OVER[$REGULAR_ID] )
            // PLSQL_DMLParser.g:1153:10: {...}? => REGULAR_ID
            {
            if ( !((enablesOverClause(input.LT(1).getText()))) ) {
                if (state.backtracking>0) {state.failed=true; return retval;}
                throw new FailedPredicateException(input, "stantard_function_enabling_over", "enablesOverClause(input.LT(1).getText())");
            }

            REGULAR_ID892=(Token)match(input,REGULAR_ID,FOLLOW_REGULAR_ID_in_stantard_function_enabling_over11978); if (state.failed) return retval; 
            if ( state.backtracking==0 ) stream_REGULAR_ID.add(REGULAR_ID892);


            // AST REWRITE
            // elements: 
            // token labels: 
            // rule labels: retval
            // token list labels: 
            // rule list labels: 
            // wildcard labels: 
            if ( state.backtracking==0 ) {

            retval.tree = root_0;
            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

            root_0 = (Object)adaptor.nil();
            // 1153:67: -> FUNCTION_ENABLING_OVER[$REGULAR_ID]
            {
                adaptor.addChild(root_0, 
                (Object)adaptor.create(FUNCTION_ENABLING_OVER, REGULAR_ID892)
                );

            }


            retval.tree = root_0;
            }

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "stantard_function_enabling_over"


    public static class stantard_function_enabling_using_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "stantard_function_enabling_using"
    // PLSQL_DMLParser.g:1156:1: stantard_function_enabling_using :{...}? => REGULAR_ID -> FUNCTION_ENABLING_USING[$REGULAR_ID] ;
    public final PLSQLParser_PLSQL_DMLParser.stantard_function_enabling_using_return stantard_function_enabling_using() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.stantard_function_enabling_using_return retval = new PLSQLParser_PLSQL_DMLParser.stantard_function_enabling_using_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token REGULAR_ID893=null;

        Object REGULAR_ID893_tree=null;
        RewriteRuleTokenStream stream_REGULAR_ID=new RewriteRuleTokenStream(adaptor,"token REGULAR_ID");

        try {
            // PLSQL_DMLParser.g:1157:5: ({...}? => REGULAR_ID -> FUNCTION_ENABLING_USING[$REGULAR_ID] )
            // PLSQL_DMLParser.g:1157:10: {...}? => REGULAR_ID
            {
            if ( !((enablesUsingClause(input.LT(1).getText()))) ) {
                if (state.backtracking>0) {state.failed=true; return retval;}
                throw new FailedPredicateException(input, "stantard_function_enabling_using", "enablesUsingClause(input.LT(1).getText())");
            }

            REGULAR_ID893=(Token)match(input,REGULAR_ID,FOLLOW_REGULAR_ID_in_stantard_function_enabling_using12006); if (state.failed) return retval; 
            if ( state.backtracking==0 ) stream_REGULAR_ID.add(REGULAR_ID893);


            // AST REWRITE
            // elements: 
            // token labels: 
            // rule labels: retval
            // token list labels: 
            // rule list labels: 
            // wildcard labels: 
            if ( state.backtracking==0 ) {

            retval.tree = root_0;
            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

            root_0 = (Object)adaptor.nil();
            // 1157:68: -> FUNCTION_ENABLING_USING[$REGULAR_ID]
            {
                adaptor.addChild(root_0, 
                (Object)adaptor.create(FUNCTION_ENABLING_USING, REGULAR_ID893)
                );

            }


            retval.tree = root_0;
            }

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "stantard_function_enabling_using"


    public static class stantard_function_enabling_within_or_over_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "stantard_function_enabling_within_or_over"
    // PLSQL_DMLParser.g:1160:1: stantard_function_enabling_within_or_over :{...}? => REGULAR_ID -> FUNCTION_ENABLING_WITHIN_OR_OVER[$REGULAR_ID] ;
    public final PLSQLParser_PLSQL_DMLParser.stantard_function_enabling_within_or_over_return stantard_function_enabling_within_or_over() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.stantard_function_enabling_within_or_over_return retval = new PLSQLParser_PLSQL_DMLParser.stantard_function_enabling_within_or_over_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token REGULAR_ID894=null;

        Object REGULAR_ID894_tree=null;
        RewriteRuleTokenStream stream_REGULAR_ID=new RewriteRuleTokenStream(adaptor,"token REGULAR_ID");

        try {
            // PLSQL_DMLParser.g:1161:5: ({...}? => REGULAR_ID -> FUNCTION_ENABLING_WITHIN_OR_OVER[$REGULAR_ID] )
            // PLSQL_DMLParser.g:1161:10: {...}? => REGULAR_ID
            {
            if ( !((enablesWithinOrOverClause(input.LT(1).getText()))) ) {
                if (state.backtracking>0) {state.failed=true; return retval;}
                throw new FailedPredicateException(input, "stantard_function_enabling_within_or_over", "enablesWithinOrOverClause(input.LT(1).getText())");
            }

            REGULAR_ID894=(Token)match(input,REGULAR_ID,FOLLOW_REGULAR_ID_in_stantard_function_enabling_within_or_over12034); if (state.failed) return retval; 
            if ( state.backtracking==0 ) stream_REGULAR_ID.add(REGULAR_ID894);


            // AST REWRITE
            // elements: 
            // token labels: 
            // rule labels: retval
            // token list labels: 
            // rule list labels: 
            // wildcard labels: 
            if ( state.backtracking==0 ) {

            retval.tree = root_0;
            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

            root_0 = (Object)adaptor.nil();
            // 1161:75: -> FUNCTION_ENABLING_WITHIN_OR_OVER[$REGULAR_ID]
            {
                adaptor.addChild(root_0, 
                (Object)adaptor.create(FUNCTION_ENABLING_WITHIN_OR_OVER, REGULAR_ID894)
                );

            }


            retval.tree = root_0;
            }

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "stantard_function_enabling_within_or_over"


    public static class stantard_function_pedictions_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "stantard_function_pedictions"
    // PLSQL_DMLParser.g:1164:1: stantard_function_pedictions :{...}? => REGULAR_ID -> PREDICTION_FUNCTION[$REGULAR_ID] ;
    public final PLSQLParser_PLSQL_DMLParser.stantard_function_pedictions_return stantard_function_pedictions() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.stantard_function_pedictions_return retval = new PLSQLParser_PLSQL_DMLParser.stantard_function_pedictions_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token REGULAR_ID895=null;

        Object REGULAR_ID895_tree=null;
        RewriteRuleTokenStream stream_REGULAR_ID=new RewriteRuleTokenStream(adaptor,"token REGULAR_ID");

        try {
            // PLSQL_DMLParser.g:1165:5: ({...}? => REGULAR_ID -> PREDICTION_FUNCTION[$REGULAR_ID] )
            // PLSQL_DMLParser.g:1165:10: {...}? => REGULAR_ID
            {
            if ( !((isStandardPredictionFunction(input.LT(1).getText()))) ) {
                if (state.backtracking>0) {state.failed=true; return retval;}
                throw new FailedPredicateException(input, "stantard_function_pedictions", "isStandardPredictionFunction(input.LT(1).getText())");
            }

            REGULAR_ID895=(Token)match(input,REGULAR_ID,FOLLOW_REGULAR_ID_in_stantard_function_pedictions12062); if (state.failed) return retval; 
            if ( state.backtracking==0 ) stream_REGULAR_ID.add(REGULAR_ID895);


            // AST REWRITE
            // elements: 
            // token labels: 
            // rule labels: retval
            // token list labels: 
            // rule list labels: 
            // wildcard labels: 
            if ( state.backtracking==0 ) {

            retval.tree = root_0;
            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

            root_0 = (Object)adaptor.nil();
            // 1165:78: -> PREDICTION_FUNCTION[$REGULAR_ID]
            {
                adaptor.addChild(root_0, 
                (Object)adaptor.create(PREDICTION_FUNCTION, REGULAR_ID895)
                );

            }


            retval.tree = root_0;
            }

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "stantard_function_pedictions"


    public static class over_clause_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "over_clause"
    // PLSQL_DMLParser.g:1168:1: over_clause : over_key ^ LEFT_PAREN ! ( query_partition_clause )? ( order_by_clause ( windowing_clause )? )? RIGHT_PAREN !;
    public final PLSQLParser_PLSQL_DMLParser.over_clause_return over_clause() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.over_clause_return retval = new PLSQLParser_PLSQL_DMLParser.over_clause_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token LEFT_PAREN897=null;
        Token RIGHT_PAREN901=null;
        PLSQLParser_PLSQLKeys.over_key_return over_key896 =null;

        PLSQLParser_PLSQL_DMLParser.query_partition_clause_return query_partition_clause898 =null;

        PLSQLParser_PLSQL_DMLParser.order_by_clause_return order_by_clause899 =null;

        PLSQLParser_PLSQL_DMLParser.windowing_clause_return windowing_clause900 =null;


        Object LEFT_PAREN897_tree=null;
        Object RIGHT_PAREN901_tree=null;

        try {
            // PLSQL_DMLParser.g:1169:5: ( over_key ^ LEFT_PAREN ! ( query_partition_clause )? ( order_by_clause ( windowing_clause )? )? RIGHT_PAREN !)
            // PLSQL_DMLParser.g:1169:10: over_key ^ LEFT_PAREN ! ( query_partition_clause )? ( order_by_clause ( windowing_clause )? )? RIGHT_PAREN !
            {
            root_0 = (Object)adaptor.nil();


            pushFollow(FOLLOW_over_key_in_over_clause12087);
            over_key896=gPLSQLParser.over_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) root_0 = (Object)adaptor.becomeRoot(over_key896.getTree(), root_0);

            LEFT_PAREN897=(Token)match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_over_clause12098); if (state.failed) return retval;

            // PLSQL_DMLParser.g:1171:13: ( query_partition_clause )?
            int alt279=2;
            int LA279_0 = input.LA(1);

            if ( (LA279_0==REGULAR_ID) && ((input.LT(1).getText().equalsIgnoreCase("partition")))) {
                alt279=1;
            }
            switch (alt279) {
                case 1 :
                    // PLSQL_DMLParser.g:1171:13: query_partition_clause
                    {
                    pushFollow(FOLLOW_query_partition_clause_in_over_clause12113);
                    query_partition_clause898=query_partition_clause();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, query_partition_clause898.getTree());

                    }
                    break;

            }


            // PLSQL_DMLParser.g:1172:13: ( order_by_clause ( windowing_clause )? )?
            int alt281=2;
            int LA281_0 = input.LA(1);

            if ( (LA281_0==SQL92_RESERVED_ORDER) ) {
                alt281=1;
            }
            switch (alt281) {
                case 1 :
                    // PLSQL_DMLParser.g:1172:14: order_by_clause ( windowing_clause )?
                    {
                    pushFollow(FOLLOW_order_by_clause_in_over_clause12129);
                    order_by_clause899=order_by_clause();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, order_by_clause899.getTree());

                    // PLSQL_DMLParser.g:1172:30: ( windowing_clause )?
                    int alt280=2;
                    int LA280_0 = input.LA(1);

                    if ( (LA280_0==REGULAR_ID) && (((input.LT(1).getText().equalsIgnoreCase("rows"))||(input.LT(1).getText().equalsIgnoreCase("range"))))) {
                        alt280=1;
                    }
                    switch (alt280) {
                        case 1 :
                            // PLSQL_DMLParser.g:1172:30: windowing_clause
                            {
                            pushFollow(FOLLOW_windowing_clause_in_over_clause12131);
                            windowing_clause900=windowing_clause();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) adaptor.addChild(root_0, windowing_clause900.getTree());

                            }
                            break;

                    }


                    }
                    break;

            }


            RIGHT_PAREN901=(Token)match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_over_clause12144); if (state.failed) return retval;

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "over_clause"


    public static class windowing_clause_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "windowing_clause"
    // PLSQL_DMLParser.g:1176:1: windowing_clause : windowing_type ( between_key windowing_elements and_key windowing_elements | windowing_elements ) -> {mode == 1}? ^( windowing_type ^( between_key ( windowing_elements )+ ) ) -> ^( windowing_type ( windowing_elements )+ ) ;
    public final PLSQLParser_PLSQL_DMLParser.windowing_clause_return windowing_clause() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.windowing_clause_return retval = new PLSQLParser_PLSQL_DMLParser.windowing_clause_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        PLSQLParser_PLSQL_DMLParser.windowing_type_return windowing_type902 =null;

        PLSQLParser_PLSQLKeys.between_key_return between_key903 =null;

        PLSQLParser_PLSQL_DMLParser.windowing_elements_return windowing_elements904 =null;

        PLSQLParser_PLSQLKeys.and_key_return and_key905 =null;

        PLSQLParser_PLSQL_DMLParser.windowing_elements_return windowing_elements906 =null;

        PLSQLParser_PLSQL_DMLParser.windowing_elements_return windowing_elements907 =null;


        RewriteRuleSubtreeStream stream_windowing_type=new RewriteRuleSubtreeStream(adaptor,"rule windowing_type");
        RewriteRuleSubtreeStream stream_between_key=new RewriteRuleSubtreeStream(adaptor,"rule between_key");
        RewriteRuleSubtreeStream stream_and_key=new RewriteRuleSubtreeStream(adaptor,"rule and_key");
        RewriteRuleSubtreeStream stream_windowing_elements=new RewriteRuleSubtreeStream(adaptor,"rule windowing_elements");
            int mode = 0;    
        try {
            // PLSQL_DMLParser.g:1178:5: ( windowing_type ( between_key windowing_elements and_key windowing_elements | windowing_elements ) -> {mode == 1}? ^( windowing_type ^( between_key ( windowing_elements )+ ) ) -> ^( windowing_type ( windowing_elements )+ ) )
            // PLSQL_DMLParser.g:1178:10: windowing_type ( between_key windowing_elements and_key windowing_elements | windowing_elements )
            {
            pushFollow(FOLLOW_windowing_type_in_windowing_clause12173);
            windowing_type902=windowing_type();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_windowing_type.add(windowing_type902.getTree());

            // PLSQL_DMLParser.g:1179:5: ( between_key windowing_elements and_key windowing_elements | windowing_elements )
            int alt282=2;
            int LA282_0 = input.LA(1);

            if ( (LA282_0==SQL92_RESERVED_BETWEEN) ) {
                alt282=1;
            }
            else if ( (LA282_0==APPROXIMATE_NUM_LIT||(LA282_0 >= CHAR_STRING && LA282_0 <= COLON)||LA282_0==DELIMITED_ID||LA282_0==EXACT_NUM_LIT||LA282_0==INTRODUCER||LA282_0==LEFT_PAREN||LA282_0==MINUS_SIGN||LA282_0==PLUS_SIGN||LA282_0==REGULAR_ID||LA282_0==SQL92_RESERVED_ALL||LA282_0==SQL92_RESERVED_ANY||LA282_0==SQL92_RESERVED_CASE||LA282_0==SQL92_RESERVED_CURRENT||LA282_0==SQL92_RESERVED_DEFAULT||LA282_0==SQL92_RESERVED_DISTINCT||(LA282_0 >= SQL92_RESERVED_EXISTS && LA282_0 <= SQL92_RESERVED_FALSE)||LA282_0==SQL92_RESERVED_NULL||LA282_0==SQL92_RESERVED_PRIOR||LA282_0==SQL92_RESERVED_TRUE||LA282_0==UNSIGNED_INTEGER) ) {
                alt282=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return retval;}
                NoViableAltException nvae =
                    new NoViableAltException("", 282, 0, input);

                throw nvae;

            }
            switch (alt282) {
                case 1 :
                    // PLSQL_DMLParser.g:1179:10: between_key windowing_elements and_key windowing_elements
                    {
                    pushFollow(FOLLOW_between_key_in_windowing_clause12184);
                    between_key903=gPLSQLParser.between_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_between_key.add(between_key903.getTree());

                    pushFollow(FOLLOW_windowing_elements_in_windowing_clause12186);
                    windowing_elements904=windowing_elements();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_windowing_elements.add(windowing_elements904.getTree());

                    pushFollow(FOLLOW_and_key_in_windowing_clause12188);
                    and_key905=gPLSQLParser.and_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_and_key.add(and_key905.getTree());

                    pushFollow(FOLLOW_windowing_elements_in_windowing_clause12190);
                    windowing_elements906=windowing_elements();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_windowing_elements.add(windowing_elements906.getTree());

                    if ( state.backtracking==0 ) {mode = 1;}

                    }
                    break;
                case 2 :
                    // PLSQL_DMLParser.g:1180:10: windowing_elements
                    {
                    pushFollow(FOLLOW_windowing_elements_in_windowing_clause12203);
                    windowing_elements907=windowing_elements();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_windowing_elements.add(windowing_elements907.getTree());

                    }
                    break;

            }


            // AST REWRITE
            // elements: between_key, windowing_elements, windowing_elements, windowing_type, windowing_type
            // token labels: 
            // rule labels: retval
            // token list labels: 
            // rule list labels: 
            // wildcard labels: 
            if ( state.backtracking==0 ) {

            retval.tree = root_0;
            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

            root_0 = (Object)adaptor.nil();
            // 1181:5: -> {mode == 1}? ^( windowing_type ^( between_key ( windowing_elements )+ ) )
            if (mode == 1) {
                // PLSQL_DMLParser.g:1181:20: ^( windowing_type ^( between_key ( windowing_elements )+ ) )
                {
                Object root_1 = (Object)adaptor.nil();
                root_1 = (Object)adaptor.becomeRoot(stream_windowing_type.nextNode(), root_1);

                // PLSQL_DMLParser.g:1181:37: ^( between_key ( windowing_elements )+ )
                {
                Object root_2 = (Object)adaptor.nil();
                root_2 = (Object)adaptor.becomeRoot(stream_between_key.nextNode(), root_2);

                if ( !(stream_windowing_elements.hasNext()) ) {
                    throw new RewriteEarlyExitException();
                }
                while ( stream_windowing_elements.hasNext() ) {
                    adaptor.addChild(root_2, stream_windowing_elements.nextTree());

                }
                stream_windowing_elements.reset();

                adaptor.addChild(root_1, root_2);
                }

                adaptor.addChild(root_0, root_1);
                }

            }

            else // 1182:5: -> ^( windowing_type ( windowing_elements )+ )
            {
                // PLSQL_DMLParser.g:1182:8: ^( windowing_type ( windowing_elements )+ )
                {
                Object root_1 = (Object)adaptor.nil();
                root_1 = (Object)adaptor.becomeRoot(stream_windowing_type.nextNode(), root_1);

                if ( !(stream_windowing_elements.hasNext()) ) {
                    throw new RewriteEarlyExitException();
                }
                while ( stream_windowing_elements.hasNext() ) {
                    adaptor.addChild(root_1, stream_windowing_elements.nextTree());

                }
                stream_windowing_elements.reset();

                adaptor.addChild(root_0, root_1);
                }

            }


            retval.tree = root_0;
            }

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "windowing_clause"


    public static class windowing_type_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "windowing_type"
    // PLSQL_DMLParser.g:1185:1: windowing_type : ( rows_key | range_key );
    public final PLSQLParser_PLSQL_DMLParser.windowing_type_return windowing_type() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.windowing_type_return retval = new PLSQLParser_PLSQL_DMLParser.windowing_type_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        PLSQLParser_PLSQLKeys.rows_key_return rows_key908 =null;

        PLSQLParser_PLSQLKeys.range_key_return range_key909 =null;



        try {
            // PLSQL_DMLParser.g:1186:5: ( rows_key | range_key )
            int alt283=2;
            int LA283_0 = input.LA(1);

            if ( (LA283_0==REGULAR_ID) && (((input.LT(1).getText().equalsIgnoreCase("rows"))||(input.LT(1).getText().equalsIgnoreCase("range"))))) {
                int LA283_1 = input.LA(2);

                if ( ((input.LT(1).getText().equalsIgnoreCase("rows"))) ) {
                    alt283=1;
                }
                else if ( ((input.LT(1).getText().equalsIgnoreCase("range"))) ) {
                    alt283=2;
                }
                else {
                    if (state.backtracking>0) {state.failed=true; return retval;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 283, 1, input);

                    throw nvae;

                }
            }
            else {
                if (state.backtracking>0) {state.failed=true; return retval;}
                NoViableAltException nvae =
                    new NoViableAltException("", 283, 0, input);

                throw nvae;

            }
            switch (alt283) {
                case 1 :
                    // PLSQL_DMLParser.g:1186:10: rows_key
                    {
                    root_0 = (Object)adaptor.nil();


                    pushFollow(FOLLOW_rows_key_in_windowing_type12262);
                    rows_key908=gPLSQLParser.rows_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, rows_key908.getTree());

                    }
                    break;
                case 2 :
                    // PLSQL_DMLParser.g:1187:10: range_key
                    {
                    root_0 = (Object)adaptor.nil();


                    pushFollow(FOLLOW_range_key_in_windowing_type12273);
                    range_key909=gPLSQLParser.range_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, range_key909.getTree());

                    }
                    break;

            }
            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "windowing_type"


    public static class windowing_elements_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "windowing_elements"
    // PLSQL_DMLParser.g:1190:1: windowing_elements : ( unbounded_key ^ preceding_key | current_key ^ row_key | concatenation_wrapper ( preceding_key ^| following_key ^) );
    public final PLSQLParser_PLSQL_DMLParser.windowing_elements_return windowing_elements() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.windowing_elements_return retval = new PLSQLParser_PLSQL_DMLParser.windowing_elements_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        PLSQLParser_PLSQLKeys.unbounded_key_return unbounded_key910 =null;

        PLSQLParser_PLSQLKeys.preceding_key_return preceding_key911 =null;

        PLSQLParser_PLSQLKeys.current_key_return current_key912 =null;

        PLSQLParser_PLSQLKeys.row_key_return row_key913 =null;

        PLSQLParser_PLSQL_DMLParser.concatenation_wrapper_return concatenation_wrapper914 =null;

        PLSQLParser_PLSQLKeys.preceding_key_return preceding_key915 =null;

        PLSQLParser_PLSQLKeys.following_key_return following_key916 =null;



        try {
            // PLSQL_DMLParser.g:1191:5: ( unbounded_key ^ preceding_key | current_key ^ row_key | concatenation_wrapper ( preceding_key ^| following_key ^) )
            int alt285=3;
            switch ( input.LA(1) ) {
            case REGULAR_ID:
                {
                int LA285_1 = input.LA(2);

                if ( (LA285_1==REGULAR_ID) ) {
                    int LA285_4 = input.LA(3);

                    if ( ((input.LT(1).getText().equalsIgnoreCase("unbounded"))) ) {
                        alt285=1;
                    }
                    else if ( (true) ) {
                        alt285=3;
                    }
                    else {
                        if (state.backtracking>0) {state.failed=true; return retval;}
                        NoViableAltException nvae =
                            new NoViableAltException("", 285, 4, input);

                        throw nvae;

                    }
                }
                else if ( (LA285_1==MINUS_SIGN||LA285_1==PLUS_SIGN) ) {
                    alt285=3;
                }
                else if ( (LA285_1==DELIMITED_ID||LA285_1==SQL92_RESERVED_ALL||LA285_1==SQL92_RESERVED_DISTINCT||LA285_1==SQL92_RESERVED_PRIOR) && ((((input.LT(1).getText().equalsIgnoreCase("new") && !input.LT(2).getText().equals("."))&&(input.LT(1).getText().equalsIgnoreCase("new") && !input.LT(2).getText().equals(".")))&&(input.LT(1).getText().equalsIgnoreCase("new"))))) {
                    alt285=3;
                }
                else if ( (LA285_1==SQL92_RESERVED_CASE) ) {
                    alt285=3;
                }
                else if ( (LA285_1==APPROXIMATE_NUM_LIT||LA285_1==CHAR_STRING||LA285_1==EXACT_NUM_LIT||LA285_1==INTRODUCER||LA285_1==SQL92_RESERVED_ANY||LA285_1==SQL92_RESERVED_DEFAULT||(LA285_1 >= SQL92_RESERVED_EXISTS && LA285_1 <= SQL92_RESERVED_FALSE)||LA285_1==SQL92_RESERVED_NULL||LA285_1==SQL92_RESERVED_TRUE||LA285_1==UNSIGNED_INTEGER) && ((((input.LT(1).getText().equalsIgnoreCase("new") && !input.LT(2).getText().equals("."))&&(input.LT(1).getText().equalsIgnoreCase("new") && !input.LT(2).getText().equals(".")))&&(input.LT(1).getText().equalsIgnoreCase("new"))))) {
                    alt285=3;
                }
                else if ( (LA285_1==ASTERISK||LA285_1==COLON||LA285_1==CONCATENATION_OP||(LA285_1 >= LEFT_BRACKET && LA285_1 <= LEFT_PAREN)||LA285_1==PERIOD||LA285_1==SOLIDUS) ) {
                    alt285=3;
                }
                else {
                    if (state.backtracking>0) {state.failed=true; return retval;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 285, 1, input);

                    throw nvae;

                }
                }
                break;
            case SQL92_RESERVED_CURRENT:
                {
                alt285=2;
                }
                break;
            case APPROXIMATE_NUM_LIT:
            case CHAR_STRING:
            case COLON:
            case DELIMITED_ID:
            case EXACT_NUM_LIT:
            case INTRODUCER:
            case LEFT_PAREN:
            case MINUS_SIGN:
            case PLUS_SIGN:
            case SQL92_RESERVED_ALL:
            case SQL92_RESERVED_ANY:
            case SQL92_RESERVED_CASE:
            case SQL92_RESERVED_DEFAULT:
            case SQL92_RESERVED_DISTINCT:
            case SQL92_RESERVED_EXISTS:
            case SQL92_RESERVED_FALSE:
            case SQL92_RESERVED_NULL:
            case SQL92_RESERVED_PRIOR:
            case SQL92_RESERVED_TRUE:
            case UNSIGNED_INTEGER:
                {
                alt285=3;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return retval;}
                NoViableAltException nvae =
                    new NoViableAltException("", 285, 0, input);

                throw nvae;

            }

            switch (alt285) {
                case 1 :
                    // PLSQL_DMLParser.g:1191:10: unbounded_key ^ preceding_key
                    {
                    root_0 = (Object)adaptor.nil();


                    pushFollow(FOLLOW_unbounded_key_in_windowing_elements12293);
                    unbounded_key910=gPLSQLParser.unbounded_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) root_0 = (Object)adaptor.becomeRoot(unbounded_key910.getTree(), root_0);

                    pushFollow(FOLLOW_preceding_key_in_windowing_elements12296);
                    preceding_key911=gPLSQLParser.preceding_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, preceding_key911.getTree());

                    }
                    break;
                case 2 :
                    // PLSQL_DMLParser.g:1192:10: current_key ^ row_key
                    {
                    root_0 = (Object)adaptor.nil();


                    pushFollow(FOLLOW_current_key_in_windowing_elements12307);
                    current_key912=gPLSQLParser.current_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) root_0 = (Object)adaptor.becomeRoot(current_key912.getTree(), root_0);

                    pushFollow(FOLLOW_row_key_in_windowing_elements12310);
                    row_key913=gPLSQLParser.row_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, row_key913.getTree());

                    }
                    break;
                case 3 :
                    // PLSQL_DMLParser.g:1193:10: concatenation_wrapper ( preceding_key ^| following_key ^)
                    {
                    root_0 = (Object)adaptor.nil();


                    pushFollow(FOLLOW_concatenation_wrapper_in_windowing_elements12321);
                    concatenation_wrapper914=concatenation_wrapper();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, concatenation_wrapper914.getTree());

                    // PLSQL_DMLParser.g:1193:32: ( preceding_key ^| following_key ^)
                    int alt284=2;
                    int LA284_0 = input.LA(1);

                    if ( (LA284_0==REGULAR_ID) && (((input.LT(1).getText().equalsIgnoreCase("preceding"))||(input.LT(1).getText().equalsIgnoreCase("following"))))) {
                        int LA284_1 = input.LA(2);

                        if ( ((input.LT(1).getText().equalsIgnoreCase("preceding"))) ) {
                            alt284=1;
                        }
                        else if ( ((input.LT(1).getText().equalsIgnoreCase("following"))) ) {
                            alt284=2;
                        }
                        else {
                            if (state.backtracking>0) {state.failed=true; return retval;}
                            NoViableAltException nvae =
                                new NoViableAltException("", 284, 1, input);

                            throw nvae;

                        }
                    }
                    else {
                        if (state.backtracking>0) {state.failed=true; return retval;}
                        NoViableAltException nvae =
                            new NoViableAltException("", 284, 0, input);

                        throw nvae;

                    }
                    switch (alt284) {
                        case 1 :
                            // PLSQL_DMLParser.g:1193:33: preceding_key ^
                            {
                            pushFollow(FOLLOW_preceding_key_in_windowing_elements12324);
                            preceding_key915=gPLSQLParser.preceding_key();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) root_0 = (Object)adaptor.becomeRoot(preceding_key915.getTree(), root_0);

                            }
                            break;
                        case 2 :
                            // PLSQL_DMLParser.g:1193:48: following_key ^
                            {
                            pushFollow(FOLLOW_following_key_in_windowing_elements12327);
                            following_key916=gPLSQLParser.following_key();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) root_0 = (Object)adaptor.becomeRoot(following_key916.getTree(), root_0);

                            }
                            break;

                    }


                    }
                    break;

            }
            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "windowing_elements"


    public static class using_clause_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "using_clause"
    // PLSQL_DMLParser.g:1196:1: using_clause : using_key ^ ( ASTERISK | using_element ( COMMA ! using_element )* ) ;
    public final PLSQLParser_PLSQL_DMLParser.using_clause_return using_clause() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.using_clause_return retval = new PLSQLParser_PLSQL_DMLParser.using_clause_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token ASTERISK918=null;
        Token COMMA920=null;
        PLSQLParser_PLSQLKeys.using_key_return using_key917 =null;

        PLSQLParser_PLSQL_DMLParser.using_element_return using_element919 =null;

        PLSQLParser_PLSQL_DMLParser.using_element_return using_element921 =null;


        Object ASTERISK918_tree=null;
        Object COMMA920_tree=null;

        try {
            // PLSQL_DMLParser.g:1197:5: ( using_key ^ ( ASTERISK | using_element ( COMMA ! using_element )* ) )
            // PLSQL_DMLParser.g:1197:10: using_key ^ ( ASTERISK | using_element ( COMMA ! using_element )* )
            {
            root_0 = (Object)adaptor.nil();


            pushFollow(FOLLOW_using_key_in_using_clause12349);
            using_key917=gPLSQLParser.using_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) root_0 = (Object)adaptor.becomeRoot(using_key917.getTree(), root_0);

            // PLSQL_DMLParser.g:1198:5: ( ASTERISK | using_element ( COMMA ! using_element )* )
            int alt287=2;
            int LA287_0 = input.LA(1);

            if ( (LA287_0==ASTERISK) ) {
                alt287=1;
            }
            else if ( (LA287_0==APPROXIMATE_NUM_LIT||(LA287_0 >= CHAR_STRING && LA287_0 <= COLON)||LA287_0==DELIMITED_ID||LA287_0==EXACT_NUM_LIT||LA287_0==INTRODUCER||LA287_0==LEFT_PAREN||LA287_0==MINUS_SIGN||LA287_0==PLUS_SIGN||LA287_0==REGULAR_ID||LA287_0==SQL92_RESERVED_ALL||LA287_0==SQL92_RESERVED_ANY||LA287_0==SQL92_RESERVED_CASE||LA287_0==SQL92_RESERVED_DEFAULT||LA287_0==SQL92_RESERVED_DISTINCT||(LA287_0 >= SQL92_RESERVED_EXISTS && LA287_0 <= SQL92_RESERVED_FALSE)||LA287_0==SQL92_RESERVED_IN||(LA287_0 >= SQL92_RESERVED_NOT && LA287_0 <= SQL92_RESERVED_NULL)||LA287_0==SQL92_RESERVED_PRIOR||LA287_0==SQL92_RESERVED_TRUE||LA287_0==UNSIGNED_INTEGER) ) {
                alt287=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return retval;}
                NoViableAltException nvae =
                    new NoViableAltException("", 287, 0, input);

                throw nvae;

            }
            switch (alt287) {
                case 1 :
                    // PLSQL_DMLParser.g:1198:10: ASTERISK
                    {
                    ASTERISK918=(Token)match(input,ASTERISK,FOLLOW_ASTERISK_in_using_clause12361); if (state.failed) return retval;
                    if ( state.backtracking==0 ) {
                    ASTERISK918_tree = 
                    (Object)adaptor.create(ASTERISK918)
                    ;
                    adaptor.addChild(root_0, ASTERISK918_tree);
                    }

                    }
                    break;
                case 2 :
                    // PLSQL_DMLParser.g:1199:10: using_element ( COMMA ! using_element )*
                    {
                    pushFollow(FOLLOW_using_element_in_using_clause12372);
                    using_element919=using_element();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, using_element919.getTree());

                    // PLSQL_DMLParser.g:1199:24: ( COMMA ! using_element )*
                    loop286:
                    do {
                        int alt286=2;
                        int LA286_0 = input.LA(1);

                        if ( (LA286_0==COMMA) ) {
                            alt286=1;
                        }


                        switch (alt286) {
                    	case 1 :
                    	    // PLSQL_DMLParser.g:1199:25: COMMA ! using_element
                    	    {
                    	    COMMA920=(Token)match(input,COMMA,FOLLOW_COMMA_in_using_clause12375); if (state.failed) return retval;

                    	    pushFollow(FOLLOW_using_element_in_using_clause12378);
                    	    using_element921=using_element();

                    	    state._fsp--;
                    	    if (state.failed) return retval;
                    	    if ( state.backtracking==0 ) adaptor.addChild(root_0, using_element921.getTree());

                    	    }
                    	    break;

                    	default :
                    	    break loop286;
                        }
                    } while (true);


                    }
                    break;

            }


            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "using_clause"


    public static class using_element_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "using_element"
    // PLSQL_DMLParser.g:1203:1: using_element : ( in_key ( out_key )? | out_key )? select_list_elements ( alias )? -> ^( ELEMENT ( in_key )? ( out_key )? select_list_elements ( alias )? ) ;
    public final PLSQLParser_PLSQL_DMLParser.using_element_return using_element() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.using_element_return retval = new PLSQLParser_PLSQL_DMLParser.using_element_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        PLSQLParser_PLSQLKeys.in_key_return in_key922 =null;

        PLSQLParser_PLSQLKeys.out_key_return out_key923 =null;

        PLSQLParser_PLSQLKeys.out_key_return out_key924 =null;

        PLSQLParser_PLSQL_DMLParser.select_list_elements_return select_list_elements925 =null;

        PLSQLParser_PLSQLCommons.alias_return alias926 =null;


        RewriteRuleSubtreeStream stream_alias=new RewriteRuleSubtreeStream(adaptor,"rule alias");
        RewriteRuleSubtreeStream stream_out_key=new RewriteRuleSubtreeStream(adaptor,"rule out_key");
        RewriteRuleSubtreeStream stream_select_list_elements=new RewriteRuleSubtreeStream(adaptor,"rule select_list_elements");
        RewriteRuleSubtreeStream stream_in_key=new RewriteRuleSubtreeStream(adaptor,"rule in_key");
        try {
            // PLSQL_DMLParser.g:1204:5: ( ( in_key ( out_key )? | out_key )? select_list_elements ( alias )? -> ^( ELEMENT ( in_key )? ( out_key )? select_list_elements ( alias )? ) )
            // PLSQL_DMLParser.g:1204:10: ( in_key ( out_key )? | out_key )? select_list_elements ( alias )?
            {
            // PLSQL_DMLParser.g:1204:10: ( in_key ( out_key )? | out_key )?
            int alt289=3;
            int LA289_0 = input.LA(1);

            if ( (LA289_0==SQL92_RESERVED_IN) ) {
                alt289=1;
            }
            else if ( (LA289_0==REGULAR_ID) ) {
                int LA289_2 = input.LA(2);

                if ( ((input.LT(1).getText().equalsIgnoreCase("out"))) ) {
                    alt289=2;
                }
            }
            switch (alt289) {
                case 1 :
                    // PLSQL_DMLParser.g:1204:11: in_key ( out_key )?
                    {
                    pushFollow(FOLLOW_in_key_in_using_element12407);
                    in_key922=gPLSQLParser.in_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_in_key.add(in_key922.getTree());

                    // PLSQL_DMLParser.g:1204:18: ( out_key )?
                    int alt288=2;
                    int LA288_0 = input.LA(1);

                    if ( (LA288_0==REGULAR_ID) ) {
                        int LA288_1 = input.LA(2);

                        if ( ((input.LT(1).getText().equalsIgnoreCase("out"))) ) {
                            alt288=1;
                        }
                    }
                    switch (alt288) {
                        case 1 :
                            // PLSQL_DMLParser.g:1204:18: out_key
                            {
                            pushFollow(FOLLOW_out_key_in_using_element12409);
                            out_key923=gPLSQLParser.out_key();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) stream_out_key.add(out_key923.getTree());

                            }
                            break;

                    }


                    }
                    break;
                case 2 :
                    // PLSQL_DMLParser.g:1204:27: out_key
                    {
                    pushFollow(FOLLOW_out_key_in_using_element12412);
                    out_key924=gPLSQLParser.out_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_out_key.add(out_key924.getTree());

                    }
                    break;

            }


            pushFollow(FOLLOW_select_list_elements_in_using_element12416);
            select_list_elements925=select_list_elements();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_select_list_elements.add(select_list_elements925.getTree());

            // PLSQL_DMLParser.g:1204:58: ( alias )?
            int alt290=2;
            switch ( input.LA(1) ) {
                case SQL92_RESERVED_AS:
                    {
                    alt290=1;
                    }
                    break;
                case INTRODUCER:
                    {
                    alt290=1;
                    }
                    break;
                case REGULAR_ID:
                    {
                    alt290=1;
                    }
                    break;
                case DELIMITED_ID:
                    {
                    alt290=1;
                    }
                    break;
                case CHAR_STRING:
                    {
                    alt290=1;
                    }
                    break;
            }

            switch (alt290) {
                case 1 :
                    // PLSQL_DMLParser.g:1204:58: alias
                    {
                    pushFollow(FOLLOW_alias_in_using_element12418);
                    alias926=gPLSQLParser.alias();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_alias.add(alias926.getTree());

                    }
                    break;

            }


            // AST REWRITE
            // elements: select_list_elements, out_key, in_key, alias
            // token labels: 
            // rule labels: retval
            // token list labels: 
            // rule list labels: 
            // wildcard labels: 
            if ( state.backtracking==0 ) {

            retval.tree = root_0;
            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

            root_0 = (Object)adaptor.nil();
            // 1205:9: -> ^( ELEMENT ( in_key )? ( out_key )? select_list_elements ( alias )? )
            {
                // PLSQL_DMLParser.g:1205:12: ^( ELEMENT ( in_key )? ( out_key )? select_list_elements ( alias )? )
                {
                Object root_1 = (Object)adaptor.nil();
                root_1 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(ELEMENT, "ELEMENT")
                , root_1);

                // PLSQL_DMLParser.g:1205:22: ( in_key )?
                if ( stream_in_key.hasNext() ) {
                    adaptor.addChild(root_1, stream_in_key.nextTree());

                }
                stream_in_key.reset();

                // PLSQL_DMLParser.g:1205:30: ( out_key )?
                if ( stream_out_key.hasNext() ) {
                    adaptor.addChild(root_1, stream_out_key.nextTree());

                }
                stream_out_key.reset();

                adaptor.addChild(root_1, stream_select_list_elements.nextTree());

                // PLSQL_DMLParser.g:1205:60: ( alias )?
                if ( stream_alias.hasNext() ) {
                    adaptor.addChild(root_1, stream_alias.nextTree());

                }
                stream_alias.reset();

                adaptor.addChild(root_0, root_1);
                }

            }


            retval.tree = root_0;
            }

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "using_element"


    public static class collect_order_by_part_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "collect_order_by_part"
    // PLSQL_DMLParser.g:1208:1: collect_order_by_part : order_key ^ by_key ! concatenation_wrapper ;
    public final PLSQLParser_PLSQL_DMLParser.collect_order_by_part_return collect_order_by_part() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.collect_order_by_part_return retval = new PLSQLParser_PLSQL_DMLParser.collect_order_by_part_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        PLSQLParser_PLSQLKeys.order_key_return order_key927 =null;

        PLSQLParser_PLSQLKeys.by_key_return by_key928 =null;

        PLSQLParser_PLSQL_DMLParser.concatenation_wrapper_return concatenation_wrapper929 =null;



        try {
            // PLSQL_DMLParser.g:1209:5: ( order_key ^ by_key ! concatenation_wrapper )
            // PLSQL_DMLParser.g:1209:10: order_key ^ by_key ! concatenation_wrapper
            {
            root_0 = (Object)adaptor.nil();


            pushFollow(FOLLOW_order_key_in_collect_order_by_part12464);
            order_key927=gPLSQLParser.order_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) root_0 = (Object)adaptor.becomeRoot(order_key927.getTree(), root_0);

            pushFollow(FOLLOW_by_key_in_collect_order_by_part12467);
            by_key928=gPLSQLParser.by_key();

            state._fsp--;
            if (state.failed) return retval;

            pushFollow(FOLLOW_concatenation_wrapper_in_collect_order_by_part12470);
            concatenation_wrapper929=concatenation_wrapper();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) adaptor.addChild(root_0, concatenation_wrapper929.getTree());

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "collect_order_by_part"


    public static class within_or_over_part_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "within_or_over_part"
    // PLSQL_DMLParser.g:1212:1: within_or_over_part : ( within_key ^ group_key ! LEFT_PAREN ! order_by_clause RIGHT_PAREN !| over_clause );
    public final PLSQLParser_PLSQL_DMLParser.within_or_over_part_return within_or_over_part() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.within_or_over_part_return retval = new PLSQLParser_PLSQL_DMLParser.within_or_over_part_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token LEFT_PAREN932=null;
        Token RIGHT_PAREN934=null;
        PLSQLParser_PLSQLKeys.within_key_return within_key930 =null;

        PLSQLParser_PLSQLKeys.group_key_return group_key931 =null;

        PLSQLParser_PLSQL_DMLParser.order_by_clause_return order_by_clause933 =null;

        PLSQLParser_PLSQL_DMLParser.over_clause_return over_clause935 =null;


        Object LEFT_PAREN932_tree=null;
        Object RIGHT_PAREN934_tree=null;

        try {
            // PLSQL_DMLParser.g:1213:5: ( within_key ^ group_key ! LEFT_PAREN ! order_by_clause RIGHT_PAREN !| over_clause )
            int alt291=2;
            int LA291_0 = input.LA(1);

            if ( (LA291_0==REGULAR_ID) && (((input.LT(1).getText().equalsIgnoreCase("over"))||(input.LT(1).getText().equalsIgnoreCase("within"))))) {
                int LA291_1 = input.LA(2);

                if ( (LA291_1==SQL92_RESERVED_GROUP) && ((input.LT(1).getText().equalsIgnoreCase("within")))) {
                    alt291=1;
                }
                else if ( (LA291_1==LEFT_PAREN) && ((input.LT(1).getText().equalsIgnoreCase("over")))) {
                    alt291=2;
                }
                else {
                    if (state.backtracking>0) {state.failed=true; return retval;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 291, 1, input);

                    throw nvae;

                }
            }
            else {
                if (state.backtracking>0) {state.failed=true; return retval;}
                NoViableAltException nvae =
                    new NoViableAltException("", 291, 0, input);

                throw nvae;

            }
            switch (alt291) {
                case 1 :
                    // PLSQL_DMLParser.g:1213:10: within_key ^ group_key ! LEFT_PAREN ! order_by_clause RIGHT_PAREN !
                    {
                    root_0 = (Object)adaptor.nil();


                    pushFollow(FOLLOW_within_key_in_within_or_over_part12490);
                    within_key930=gPLSQLParser.within_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) root_0 = (Object)adaptor.becomeRoot(within_key930.getTree(), root_0);

                    pushFollow(FOLLOW_group_key_in_within_or_over_part12493);
                    group_key931=gPLSQLParser.group_key();

                    state._fsp--;
                    if (state.failed) return retval;

                    LEFT_PAREN932=(Token)match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_within_or_over_part12496); if (state.failed) return retval;

                    pushFollow(FOLLOW_order_by_clause_in_within_or_over_part12499);
                    order_by_clause933=order_by_clause();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, order_by_clause933.getTree());

                    RIGHT_PAREN934=(Token)match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_within_or_over_part12501); if (state.failed) return retval;

                    }
                    break;
                case 2 :
                    // PLSQL_DMLParser.g:1214:10: over_clause
                    {
                    root_0 = (Object)adaptor.nil();


                    pushFollow(FOLLOW_over_clause_in_within_or_over_part12513);
                    over_clause935=over_clause();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, over_clause935.getTree());

                    }
                    break;

            }
            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "within_or_over_part"


    public static class cost_matrix_clause_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "cost_matrix_clause"
    // PLSQL_DMLParser.g:1217:1: cost_matrix_clause : cost_key ^ ( model_key ( auto_key )? | LEFT_PAREN ! cost_class_name ( COMMA ! cost_class_name )* RIGHT_PAREN ! values_key ! expression_list ) ;
    public final PLSQLParser_PLSQL_DMLParser.cost_matrix_clause_return cost_matrix_clause() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.cost_matrix_clause_return retval = new PLSQLParser_PLSQL_DMLParser.cost_matrix_clause_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token LEFT_PAREN939=null;
        Token COMMA941=null;
        Token RIGHT_PAREN943=null;
        PLSQLParser_PLSQLKeys.cost_key_return cost_key936 =null;

        PLSQLParser_PLSQLKeys.model_key_return model_key937 =null;

        PLSQLParser_PLSQLKeys.auto_key_return auto_key938 =null;

        PLSQLParser_PLSQLCommons.cost_class_name_return cost_class_name940 =null;

        PLSQLParser_PLSQLCommons.cost_class_name_return cost_class_name942 =null;

        PLSQLParser_PLSQLKeys.values_key_return values_key944 =null;

        PLSQLParser_PLSQL_DMLParser.expression_list_return expression_list945 =null;


        Object LEFT_PAREN939_tree=null;
        Object COMMA941_tree=null;
        Object RIGHT_PAREN943_tree=null;

        try {
            // PLSQL_DMLParser.g:1218:5: ( cost_key ^ ( model_key ( auto_key )? | LEFT_PAREN ! cost_class_name ( COMMA ! cost_class_name )* RIGHT_PAREN ! values_key ! expression_list ) )
            // PLSQL_DMLParser.g:1218:10: cost_key ^ ( model_key ( auto_key )? | LEFT_PAREN ! cost_class_name ( COMMA ! cost_class_name )* RIGHT_PAREN ! values_key ! expression_list )
            {
            root_0 = (Object)adaptor.nil();


            pushFollow(FOLLOW_cost_key_in_cost_matrix_clause12533);
            cost_key936=gPLSQLParser.cost_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) root_0 = (Object)adaptor.becomeRoot(cost_key936.getTree(), root_0);

            // PLSQL_DMLParser.g:1219:5: ( model_key ( auto_key )? | LEFT_PAREN ! cost_class_name ( COMMA ! cost_class_name )* RIGHT_PAREN ! values_key ! expression_list )
            int alt294=2;
            int LA294_0 = input.LA(1);

            if ( (LA294_0==PLSQL_NON_RESERVED_MODEL) ) {
                alt294=1;
            }
            else if ( (LA294_0==LEFT_PAREN) ) {
                alt294=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return retval;}
                NoViableAltException nvae =
                    new NoViableAltException("", 294, 0, input);

                throw nvae;

            }
            switch (alt294) {
                case 1 :
                    // PLSQL_DMLParser.g:1219:10: model_key ( auto_key )?
                    {
                    pushFollow(FOLLOW_model_key_in_cost_matrix_clause12545);
                    model_key937=gPLSQLParser.model_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, model_key937.getTree());

                    // PLSQL_DMLParser.g:1219:20: ( auto_key )?
                    int alt292=2;
                    int LA292_0 = input.LA(1);

                    if ( (LA292_0==REGULAR_ID) && ((input.LT(1).getText().equalsIgnoreCase("auto")))) {
                        alt292=1;
                    }
                    switch (alt292) {
                        case 1 :
                            // PLSQL_DMLParser.g:1219:20: auto_key
                            {
                            pushFollow(FOLLOW_auto_key_in_cost_matrix_clause12547);
                            auto_key938=gPLSQLParser.auto_key();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) adaptor.addChild(root_0, auto_key938.getTree());

                            }
                            break;

                    }


                    }
                    break;
                case 2 :
                    // PLSQL_DMLParser.g:1220:10: LEFT_PAREN ! cost_class_name ( COMMA ! cost_class_name )* RIGHT_PAREN ! values_key ! expression_list
                    {
                    LEFT_PAREN939=(Token)match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_cost_matrix_clause12559); if (state.failed) return retval;

                    pushFollow(FOLLOW_cost_class_name_in_cost_matrix_clause12562);
                    cost_class_name940=gPLSQLParser.cost_class_name();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, cost_class_name940.getTree());

                    // PLSQL_DMLParser.g:1220:38: ( COMMA ! cost_class_name )*
                    loop293:
                    do {
                        int alt293=2;
                        int LA293_0 = input.LA(1);

                        if ( (LA293_0==COMMA) ) {
                            alt293=1;
                        }


                        switch (alt293) {
                    	case 1 :
                    	    // PLSQL_DMLParser.g:1220:39: COMMA ! cost_class_name
                    	    {
                    	    COMMA941=(Token)match(input,COMMA,FOLLOW_COMMA_in_cost_matrix_clause12565); if (state.failed) return retval;

                    	    pushFollow(FOLLOW_cost_class_name_in_cost_matrix_clause12568);
                    	    cost_class_name942=gPLSQLParser.cost_class_name();

                    	    state._fsp--;
                    	    if (state.failed) return retval;
                    	    if ( state.backtracking==0 ) adaptor.addChild(root_0, cost_class_name942.getTree());

                    	    }
                    	    break;

                    	default :
                    	    break loop293;
                        }
                    } while (true);


                    RIGHT_PAREN943=(Token)match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_cost_matrix_clause12572); if (state.failed) return retval;

                    pushFollow(FOLLOW_values_key_in_cost_matrix_clause12575);
                    values_key944=gPLSQLParser.values_key();

                    state._fsp--;
                    if (state.failed) return retval;

                    pushFollow(FOLLOW_expression_list_in_cost_matrix_clause12591);
                    expression_list945=expression_list();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, expression_list945.getTree());

                    }
                    break;

            }


            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "cost_matrix_clause"


    public static class xml_passing_clause_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "xml_passing_clause"
    // PLSQL_DMLParser.g:1225:1: xml_passing_clause : passing_key ^ ( by_key ! value_key )? expression_wrapper ( alias )? ( COMMA ! expression_wrapper ( alias )? ) ;
    public final PLSQLParser_PLSQL_DMLParser.xml_passing_clause_return xml_passing_clause() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.xml_passing_clause_return retval = new PLSQLParser_PLSQL_DMLParser.xml_passing_clause_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token COMMA951=null;
        PLSQLParser_PLSQLKeys.passing_key_return passing_key946 =null;

        PLSQLParser_PLSQLKeys.by_key_return by_key947 =null;

        PLSQLParser_PLSQLKeys.value_key_return value_key948 =null;

        PLSQLParser_PLSQL_DMLParser.expression_wrapper_return expression_wrapper949 =null;

        PLSQLParser_PLSQLCommons.alias_return alias950 =null;

        PLSQLParser_PLSQL_DMLParser.expression_wrapper_return expression_wrapper952 =null;

        PLSQLParser_PLSQLCommons.alias_return alias953 =null;


        Object COMMA951_tree=null;

        try {
            // PLSQL_DMLParser.g:1226:5: ( passing_key ^ ( by_key ! value_key )? expression_wrapper ( alias )? ( COMMA ! expression_wrapper ( alias )? ) )
            // PLSQL_DMLParser.g:1226:10: passing_key ^ ( by_key ! value_key )? expression_wrapper ( alias )? ( COMMA ! expression_wrapper ( alias )? )
            {
            root_0 = (Object)adaptor.nil();


            pushFollow(FOLLOW_passing_key_in_xml_passing_clause12617);
            passing_key946=gPLSQLParser.passing_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) root_0 = (Object)adaptor.becomeRoot(passing_key946.getTree(), root_0);

            // PLSQL_DMLParser.g:1226:23: ( by_key ! value_key )?
            int alt295=2;
            int LA295_0 = input.LA(1);

            if ( (LA295_0==SQL92_RESERVED_BY) ) {
                alt295=1;
            }
            switch (alt295) {
                case 1 :
                    // PLSQL_DMLParser.g:1226:24: by_key ! value_key
                    {
                    pushFollow(FOLLOW_by_key_in_xml_passing_clause12621);
                    by_key947=gPLSQLParser.by_key();

                    state._fsp--;
                    if (state.failed) return retval;

                    pushFollow(FOLLOW_value_key_in_xml_passing_clause12624);
                    value_key948=gPLSQLParser.value_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, value_key948.getTree());

                    }
                    break;

            }


            pushFollow(FOLLOW_expression_wrapper_in_xml_passing_clause12640);
            expression_wrapper949=expression_wrapper();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) adaptor.addChild(root_0, expression_wrapper949.getTree());

            // PLSQL_DMLParser.g:1227:32: ( alias )?
            int alt296=2;
            int LA296_0 = input.LA(1);

            if ( (LA296_0==CHAR_STRING||LA296_0==DELIMITED_ID||LA296_0==INTRODUCER||LA296_0==REGULAR_ID||LA296_0==SQL92_RESERVED_AS) ) {
                alt296=1;
            }
            switch (alt296) {
                case 1 :
                    // PLSQL_DMLParser.g:1227:32: alias
                    {
                    pushFollow(FOLLOW_alias_in_xml_passing_clause12642);
                    alias950=gPLSQLParser.alias();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, alias950.getTree());

                    }
                    break;

            }


            // PLSQL_DMLParser.g:1227:39: ( COMMA ! expression_wrapper ( alias )? )
            // PLSQL_DMLParser.g:1227:40: COMMA ! expression_wrapper ( alias )?
            {
            COMMA951=(Token)match(input,COMMA,FOLLOW_COMMA_in_xml_passing_clause12646); if (state.failed) return retval;

            pushFollow(FOLLOW_expression_wrapper_in_xml_passing_clause12649);
            expression_wrapper952=expression_wrapper();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) adaptor.addChild(root_0, expression_wrapper952.getTree());

            // PLSQL_DMLParser.g:1227:66: ( alias )?
            int alt297=2;
            int LA297_0 = input.LA(1);

            if ( (LA297_0==CHAR_STRING||LA297_0==DELIMITED_ID||LA297_0==INTRODUCER||LA297_0==SQL92_RESERVED_AS) ) {
                alt297=1;
            }
            else if ( (LA297_0==REGULAR_ID) ) {
                int LA297_2 = input.LA(2);

                if ( (LA297_2==PLSQL_RESERVED_COLUMNS||LA297_2==RIGHT_PAREN) ) {
                    alt297=1;
                }
                else if ( (LA297_2==REGULAR_ID) ) {
                    int LA297_4 = input.LA(3);

                    if ( (LA297_4==REGULAR_ID) ) {
                        alt297=1;
                    }
                }
            }
            switch (alt297) {
                case 1 :
                    // PLSQL_DMLParser.g:1227:66: alias
                    {
                    pushFollow(FOLLOW_alias_in_xml_passing_clause12651);
                    alias953=gPLSQLParser.alias();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, alias953.getTree());

                    }
                    break;

            }


            }


            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "xml_passing_clause"


    public static class xml_attributes_clause_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "xml_attributes_clause"
    // PLSQL_DMLParser.g:1230:1: xml_attributes_clause : xmlattributes_key ^ LEFT_PAREN ! ( entityescaping_key | noentityescaping_key )? ( schemacheck_key | noschemacheck_key )? xml_multiuse_expression_element ( COMMA ! xml_multiuse_expression_element )* RIGHT_PAREN !;
    public final PLSQLParser_PLSQL_DMLParser.xml_attributes_clause_return xml_attributes_clause() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.xml_attributes_clause_return retval = new PLSQLParser_PLSQL_DMLParser.xml_attributes_clause_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token LEFT_PAREN955=null;
        Token COMMA961=null;
        Token RIGHT_PAREN963=null;
        PLSQLParser_PLSQLKeys.xmlattributes_key_return xmlattributes_key954 =null;

        PLSQLParser_PLSQLKeys.entityescaping_key_return entityescaping_key956 =null;

        PLSQLParser_PLSQLKeys.noentityescaping_key_return noentityescaping_key957 =null;

        PLSQLParser_PLSQLKeys.schemacheck_key_return schemacheck_key958 =null;

        PLSQLParser_PLSQLKeys.noschemacheck_key_return noschemacheck_key959 =null;

        PLSQLParser_PLSQL_DMLParser.xml_multiuse_expression_element_return xml_multiuse_expression_element960 =null;

        PLSQLParser_PLSQL_DMLParser.xml_multiuse_expression_element_return xml_multiuse_expression_element962 =null;


        Object LEFT_PAREN955_tree=null;
        Object COMMA961_tree=null;
        Object RIGHT_PAREN963_tree=null;

        try {
            // PLSQL_DMLParser.g:1231:5: ( xmlattributes_key ^ LEFT_PAREN ! ( entityescaping_key | noentityescaping_key )? ( schemacheck_key | noschemacheck_key )? xml_multiuse_expression_element ( COMMA ! xml_multiuse_expression_element )* RIGHT_PAREN !)
            // PLSQL_DMLParser.g:1231:10: xmlattributes_key ^ LEFT_PAREN ! ( entityescaping_key | noentityescaping_key )? ( schemacheck_key | noschemacheck_key )? xml_multiuse_expression_element ( COMMA ! xml_multiuse_expression_element )* RIGHT_PAREN !
            {
            root_0 = (Object)adaptor.nil();


            pushFollow(FOLLOW_xmlattributes_key_in_xml_attributes_clause12673);
            xmlattributes_key954=gPLSQLParser.xmlattributes_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) root_0 = (Object)adaptor.becomeRoot(xmlattributes_key954.getTree(), root_0);

            LEFT_PAREN955=(Token)match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_xml_attributes_clause12684); if (state.failed) return retval;

            // PLSQL_DMLParser.g:1233:13: ( entityescaping_key | noentityescaping_key )?
            int alt298=3;
            int LA298_0 = input.LA(1);

            if ( (LA298_0==REGULAR_ID) ) {
                int LA298_1 = input.LA(2);

                if ( ((input.LT(1).getText().equalsIgnoreCase("entityescaping"))) ) {
                    alt298=1;
                }
                else if ( ((input.LT(1).getText().equalsIgnoreCase("noentityescaping"))) ) {
                    alt298=2;
                }
            }
            switch (alt298) {
                case 1 :
                    // PLSQL_DMLParser.g:1233:14: entityescaping_key
                    {
                    pushFollow(FOLLOW_entityescaping_key_in_xml_attributes_clause12700);
                    entityescaping_key956=gPLSQLParser.entityescaping_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, entityescaping_key956.getTree());

                    }
                    break;
                case 2 :
                    // PLSQL_DMLParser.g:1233:33: noentityescaping_key
                    {
                    pushFollow(FOLLOW_noentityescaping_key_in_xml_attributes_clause12702);
                    noentityescaping_key957=gPLSQLParser.noentityescaping_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, noentityescaping_key957.getTree());

                    }
                    break;

            }


            // PLSQL_DMLParser.g:1234:13: ( schemacheck_key | noschemacheck_key )?
            int alt299=3;
            int LA299_0 = input.LA(1);

            if ( (LA299_0==REGULAR_ID) ) {
                int LA299_1 = input.LA(2);

                if ( ((input.LT(1).getText().equalsIgnoreCase("schemacheck"))) ) {
                    alt299=1;
                }
                else if ( ((input.LT(1).getText().equalsIgnoreCase("noschemacheck"))) ) {
                    alt299=2;
                }
            }
            switch (alt299) {
                case 1 :
                    // PLSQL_DMLParser.g:1234:14: schemacheck_key
                    {
                    pushFollow(FOLLOW_schemacheck_key_in_xml_attributes_clause12719);
                    schemacheck_key958=gPLSQLParser.schemacheck_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, schemacheck_key958.getTree());

                    }
                    break;
                case 2 :
                    // PLSQL_DMLParser.g:1234:30: noschemacheck_key
                    {
                    pushFollow(FOLLOW_noschemacheck_key_in_xml_attributes_clause12721);
                    noschemacheck_key959=gPLSQLParser.noschemacheck_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, noschemacheck_key959.getTree());

                    }
                    break;

            }


            pushFollow(FOLLOW_xml_multiuse_expression_element_in_xml_attributes_clause12737);
            xml_multiuse_expression_element960=xml_multiuse_expression_element();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) adaptor.addChild(root_0, xml_multiuse_expression_element960.getTree());

            // PLSQL_DMLParser.g:1235:45: ( COMMA ! xml_multiuse_expression_element )*
            loop300:
            do {
                int alt300=2;
                int LA300_0 = input.LA(1);

                if ( (LA300_0==COMMA) ) {
                    alt300=1;
                }


                switch (alt300) {
            	case 1 :
            	    // PLSQL_DMLParser.g:1235:46: COMMA ! xml_multiuse_expression_element
            	    {
            	    COMMA961=(Token)match(input,COMMA,FOLLOW_COMMA_in_xml_attributes_clause12740); if (state.failed) return retval;

            	    pushFollow(FOLLOW_xml_multiuse_expression_element_in_xml_attributes_clause12743);
            	    xml_multiuse_expression_element962=xml_multiuse_expression_element();

            	    state._fsp--;
            	    if (state.failed) return retval;
            	    if ( state.backtracking==0 ) adaptor.addChild(root_0, xml_multiuse_expression_element962.getTree());

            	    }
            	    break;

            	default :
            	    break loop300;
                }
            } while (true);


            RIGHT_PAREN963=(Token)match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_xml_attributes_clause12755); if (state.failed) return retval;

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "xml_attributes_clause"


    public static class xml_namespaces_clause_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "xml_namespaces_clause"
    // PLSQL_DMLParser.g:1239:1: xml_namespaces_clause : xmlnamespaces_key ^ LEFT_PAREN ! ( concatenation_wrapper alias )? ( COMMA ! concatenation_wrapper alias )* ( ( default_key )=> xml_general_default_part )? RIGHT_PAREN !;
    public final PLSQLParser_PLSQL_DMLParser.xml_namespaces_clause_return xml_namespaces_clause() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.xml_namespaces_clause_return retval = new PLSQLParser_PLSQL_DMLParser.xml_namespaces_clause_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token LEFT_PAREN965=null;
        Token COMMA968=null;
        Token RIGHT_PAREN972=null;
        PLSQLParser_PLSQLKeys.xmlnamespaces_key_return xmlnamespaces_key964 =null;

        PLSQLParser_PLSQL_DMLParser.concatenation_wrapper_return concatenation_wrapper966 =null;

        PLSQLParser_PLSQLCommons.alias_return alias967 =null;

        PLSQLParser_PLSQL_DMLParser.concatenation_wrapper_return concatenation_wrapper969 =null;

        PLSQLParser_PLSQLCommons.alias_return alias970 =null;

        PLSQLParser_PLSQL_DMLParser.xml_general_default_part_return xml_general_default_part971 =null;


        Object LEFT_PAREN965_tree=null;
        Object COMMA968_tree=null;
        Object RIGHT_PAREN972_tree=null;

        try {
            // PLSQL_DMLParser.g:1240:5: ( xmlnamespaces_key ^ LEFT_PAREN ! ( concatenation_wrapper alias )? ( COMMA ! concatenation_wrapper alias )* ( ( default_key )=> xml_general_default_part )? RIGHT_PAREN !)
            // PLSQL_DMLParser.g:1240:10: xmlnamespaces_key ^ LEFT_PAREN ! ( concatenation_wrapper alias )? ( COMMA ! concatenation_wrapper alias )* ( ( default_key )=> xml_general_default_part )? RIGHT_PAREN !
            {
            root_0 = (Object)adaptor.nil();


            pushFollow(FOLLOW_xmlnamespaces_key_in_xml_namespaces_clause12776);
            xmlnamespaces_key964=gPLSQLParser.xmlnamespaces_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) root_0 = (Object)adaptor.becomeRoot(xmlnamespaces_key964.getTree(), root_0);

            LEFT_PAREN965=(Token)match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_xml_namespaces_clause12787); if (state.failed) return retval;

            // PLSQL_DMLParser.g:1242:13: ( concatenation_wrapper alias )?
            int alt301=2;
            int LA301_0 = input.LA(1);

            if ( (LA301_0==APPROXIMATE_NUM_LIT||(LA301_0 >= CHAR_STRING && LA301_0 <= COLON)||LA301_0==DELIMITED_ID||LA301_0==EXACT_NUM_LIT||LA301_0==INTRODUCER||LA301_0==LEFT_PAREN||LA301_0==MINUS_SIGN||LA301_0==PLUS_SIGN||LA301_0==REGULAR_ID||LA301_0==SQL92_RESERVED_ALL||LA301_0==SQL92_RESERVED_ANY||LA301_0==SQL92_RESERVED_CASE||LA301_0==SQL92_RESERVED_DISTINCT||(LA301_0 >= SQL92_RESERVED_EXISTS && LA301_0 <= SQL92_RESERVED_FALSE)||LA301_0==SQL92_RESERVED_NULL||LA301_0==SQL92_RESERVED_PRIOR||LA301_0==SQL92_RESERVED_TRUE||LA301_0==UNSIGNED_INTEGER) ) {
                alt301=1;
            }
            else if ( (LA301_0==SQL92_RESERVED_DEFAULT) ) {
                alt301=1;
            }
            switch (alt301) {
                case 1 :
                    // PLSQL_DMLParser.g:1242:14: concatenation_wrapper alias
                    {
                    pushFollow(FOLLOW_concatenation_wrapper_in_xml_namespaces_clause12803);
                    concatenation_wrapper966=concatenation_wrapper();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, concatenation_wrapper966.getTree());

                    pushFollow(FOLLOW_alias_in_xml_namespaces_clause12805);
                    alias967=gPLSQLParser.alias();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, alias967.getTree());

                    }
                    break;

            }


            // PLSQL_DMLParser.g:1243:17: ( COMMA ! concatenation_wrapper alias )*
            loop302:
            do {
                int alt302=2;
                int LA302_0 = input.LA(1);

                if ( (LA302_0==COMMA) ) {
                    alt302=1;
                }


                switch (alt302) {
            	case 1 :
            	    // PLSQL_DMLParser.g:1243:18: COMMA ! concatenation_wrapper alias
            	    {
            	    COMMA968=(Token)match(input,COMMA,FOLLOW_COMMA_in_xml_namespaces_clause12827); if (state.failed) return retval;

            	    pushFollow(FOLLOW_concatenation_wrapper_in_xml_namespaces_clause12830);
            	    concatenation_wrapper969=concatenation_wrapper();

            	    state._fsp--;
            	    if (state.failed) return retval;
            	    if ( state.backtracking==0 ) adaptor.addChild(root_0, concatenation_wrapper969.getTree());

            	    pushFollow(FOLLOW_alias_in_xml_namespaces_clause12832);
            	    alias970=gPLSQLParser.alias();

            	    state._fsp--;
            	    if (state.failed) return retval;
            	    if ( state.backtracking==0 ) adaptor.addChild(root_0, alias970.getTree());

            	    }
            	    break;

            	default :
            	    break loop302;
                }
            } while (true);


            // PLSQL_DMLParser.g:1244:13: ( ( default_key )=> xml_general_default_part )?
            int alt303=2;
            int LA303_0 = input.LA(1);

            if ( (LA303_0==SQL92_RESERVED_DEFAULT) && (synpred23_PLSQL_DMLParser())) {
                alt303=1;
            }
            switch (alt303) {
                case 1 :
                    // PLSQL_DMLParser.g:1244:14: ( default_key )=> xml_general_default_part
                    {
                    pushFollow(FOLLOW_xml_general_default_part_in_xml_namespaces_clause12854);
                    xml_general_default_part971=xml_general_default_part();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, xml_general_default_part971.getTree());

                    }
                    break;

            }


            RIGHT_PAREN972=(Token)match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_xml_namespaces_clause12866); if (state.failed) return retval;

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "xml_namespaces_clause"


    public static class xml_table_column_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "xml_table_column"
    // PLSQL_DMLParser.g:1248:1: xml_table_column : xml_column_name ( for_key ordinality_key | type_spec ( path_key concatenation_wrapper )? ( ( default_key )=> xml_general_default_part )? ) -> ^( XML_COLUMN xml_column_name ( ordinality_key )? ( type_spec )? ( concatenation_wrapper )? ( xml_general_default_part )? ) ;
    public final PLSQLParser_PLSQL_DMLParser.xml_table_column_return xml_table_column() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.xml_table_column_return retval = new PLSQLParser_PLSQL_DMLParser.xml_table_column_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        PLSQLParser_PLSQLCommons.xml_column_name_return xml_column_name973 =null;

        PLSQLParser_PLSQLKeys.for_key_return for_key974 =null;

        PLSQLParser_PLSQLKeys.ordinality_key_return ordinality_key975 =null;

        PLSQLParser_PLSQLCommons.type_spec_return type_spec976 =null;

        PLSQLParser_PLSQLKeys.path_key_return path_key977 =null;

        PLSQLParser_PLSQL_DMLParser.concatenation_wrapper_return concatenation_wrapper978 =null;

        PLSQLParser_PLSQL_DMLParser.xml_general_default_part_return xml_general_default_part979 =null;


        RewriteRuleSubtreeStream stream_type_spec=new RewriteRuleSubtreeStream(adaptor,"rule type_spec");
        RewriteRuleSubtreeStream stream_concatenation_wrapper=new RewriteRuleSubtreeStream(adaptor,"rule concatenation_wrapper");
        RewriteRuleSubtreeStream stream_xml_column_name=new RewriteRuleSubtreeStream(adaptor,"rule xml_column_name");
        RewriteRuleSubtreeStream stream_path_key=new RewriteRuleSubtreeStream(adaptor,"rule path_key");
        RewriteRuleSubtreeStream stream_ordinality_key=new RewriteRuleSubtreeStream(adaptor,"rule ordinality_key");
        RewriteRuleSubtreeStream stream_xml_general_default_part=new RewriteRuleSubtreeStream(adaptor,"rule xml_general_default_part");
        RewriteRuleSubtreeStream stream_for_key=new RewriteRuleSubtreeStream(adaptor,"rule for_key");
        try {
            // PLSQL_DMLParser.g:1249:5: ( xml_column_name ( for_key ordinality_key | type_spec ( path_key concatenation_wrapper )? ( ( default_key )=> xml_general_default_part )? ) -> ^( XML_COLUMN xml_column_name ( ordinality_key )? ( type_spec )? ( concatenation_wrapper )? ( xml_general_default_part )? ) )
            // PLSQL_DMLParser.g:1249:10: xml_column_name ( for_key ordinality_key | type_spec ( path_key concatenation_wrapper )? ( ( default_key )=> xml_general_default_part )? )
            {
            pushFollow(FOLLOW_xml_column_name_in_xml_table_column12887);
            xml_column_name973=gPLSQLParser.xml_column_name();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_xml_column_name.add(xml_column_name973.getTree());

            // PLSQL_DMLParser.g:1250:5: ( for_key ordinality_key | type_spec ( path_key concatenation_wrapper )? ( ( default_key )=> xml_general_default_part )? )
            int alt306=2;
            int LA306_0 = input.LA(1);

            if ( (LA306_0==SQL92_RESERVED_FOR) ) {
                alt306=1;
            }
            else if ( (LA306_0==DELIMITED_ID||LA306_0==REGULAR_ID) ) {
                alt306=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return retval;}
                NoViableAltException nvae =
                    new NoViableAltException("", 306, 0, input);

                throw nvae;

            }
            switch (alt306) {
                case 1 :
                    // PLSQL_DMLParser.g:1250:10: for_key ordinality_key
                    {
                    pushFollow(FOLLOW_for_key_in_xml_table_column12898);
                    for_key974=gPLSQLParser.for_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_for_key.add(for_key974.getTree());

                    pushFollow(FOLLOW_ordinality_key_in_xml_table_column12900);
                    ordinality_key975=gPLSQLParser.ordinality_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_ordinality_key.add(ordinality_key975.getTree());

                    }
                    break;
                case 2 :
                    // PLSQL_DMLParser.g:1251:10: type_spec ( path_key concatenation_wrapper )? ( ( default_key )=> xml_general_default_part )?
                    {
                    pushFollow(FOLLOW_type_spec_in_xml_table_column12911);
                    type_spec976=gPLSQLParser.type_spec();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_type_spec.add(type_spec976.getTree());

                    // PLSQL_DMLParser.g:1251:20: ( path_key concatenation_wrapper )?
                    int alt304=2;
                    int LA304_0 = input.LA(1);

                    if ( (LA304_0==REGULAR_ID) && ((input.LT(1).getText().equalsIgnoreCase("path")))) {
                        alt304=1;
                    }
                    switch (alt304) {
                        case 1 :
                            // PLSQL_DMLParser.g:1251:21: path_key concatenation_wrapper
                            {
                            pushFollow(FOLLOW_path_key_in_xml_table_column12914);
                            path_key977=gPLSQLParser.path_key();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) stream_path_key.add(path_key977.getTree());

                            pushFollow(FOLLOW_concatenation_wrapper_in_xml_table_column12916);
                            concatenation_wrapper978=concatenation_wrapper();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) stream_concatenation_wrapper.add(concatenation_wrapper978.getTree());

                            }
                            break;

                    }


                    // PLSQL_DMLParser.g:1251:54: ( ( default_key )=> xml_general_default_part )?
                    int alt305=2;
                    int LA305_0 = input.LA(1);

                    if ( (LA305_0==SQL92_RESERVED_DEFAULT) && (synpred24_PLSQL_DMLParser())) {
                        alt305=1;
                    }
                    switch (alt305) {
                        case 1 :
                            // PLSQL_DMLParser.g:1251:55: ( default_key )=> xml_general_default_part
                            {
                            pushFollow(FOLLOW_xml_general_default_part_in_xml_table_column12926);
                            xml_general_default_part979=xml_general_default_part();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) stream_xml_general_default_part.add(xml_general_default_part979.getTree());

                            }
                            break;

                    }


                    }
                    break;

            }


            // AST REWRITE
            // elements: xml_column_name, ordinality_key, type_spec, concatenation_wrapper, xml_general_default_part
            // token labels: 
            // rule labels: retval
            // token list labels: 
            // rule list labels: 
            // wildcard labels: 
            if ( state.backtracking==0 ) {

            retval.tree = root_0;
            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

            root_0 = (Object)adaptor.nil();
            // 1253:9: -> ^( XML_COLUMN xml_column_name ( ordinality_key )? ( type_spec )? ( concatenation_wrapper )? ( xml_general_default_part )? )
            {
                // PLSQL_DMLParser.g:1253:12: ^( XML_COLUMN xml_column_name ( ordinality_key )? ( type_spec )? ( concatenation_wrapper )? ( xml_general_default_part )? )
                {
                Object root_1 = (Object)adaptor.nil();
                root_1 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(XML_COLUMN, "XML_COLUMN")
                , root_1);

                adaptor.addChild(root_1, stream_xml_column_name.nextTree());

                // PLSQL_DMLParser.g:1253:41: ( ordinality_key )?
                if ( stream_ordinality_key.hasNext() ) {
                    adaptor.addChild(root_1, stream_ordinality_key.nextTree());

                }
                stream_ordinality_key.reset();

                // PLSQL_DMLParser.g:1253:57: ( type_spec )?
                if ( stream_type_spec.hasNext() ) {
                    adaptor.addChild(root_1, stream_type_spec.nextTree());

                }
                stream_type_spec.reset();

                // PLSQL_DMLParser.g:1253:68: ( concatenation_wrapper )?
                if ( stream_concatenation_wrapper.hasNext() ) {
                    adaptor.addChild(root_1, stream_concatenation_wrapper.nextTree());

                }
                stream_concatenation_wrapper.reset();

                // PLSQL_DMLParser.g:1253:91: ( xml_general_default_part )?
                if ( stream_xml_general_default_part.hasNext() ) {
                    adaptor.addChild(root_1, stream_xml_general_default_part.nextTree());

                }
                stream_xml_general_default_part.reset();

                adaptor.addChild(root_0, root_1);
                }

            }


            retval.tree = root_0;
            }

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "xml_table_column"


    public static class xml_general_default_part_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "xml_general_default_part"
    // PLSQL_DMLParser.g:1256:1: xml_general_default_part : default_key ^ concatenation_wrapper ;
    public final PLSQLParser_PLSQL_DMLParser.xml_general_default_part_return xml_general_default_part() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.xml_general_default_part_return retval = new PLSQLParser_PLSQL_DMLParser.xml_general_default_part_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        PLSQLParser_PLSQLKeys.default_key_return default_key980 =null;

        PLSQLParser_PLSQL_DMLParser.concatenation_wrapper_return concatenation_wrapper981 =null;



        try {
            // PLSQL_DMLParser.g:1257:5: ( default_key ^ concatenation_wrapper )
            // PLSQL_DMLParser.g:1257:10: default_key ^ concatenation_wrapper
            {
            root_0 = (Object)adaptor.nil();


            pushFollow(FOLLOW_default_key_in_xml_general_default_part12982);
            default_key980=gPLSQLParser.default_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) root_0 = (Object)adaptor.becomeRoot(default_key980.getTree(), root_0);

            pushFollow(FOLLOW_concatenation_wrapper_in_xml_general_default_part12985);
            concatenation_wrapper981=concatenation_wrapper();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) adaptor.addChild(root_0, concatenation_wrapper981.getTree());

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "xml_general_default_part"


    public static class xml_multiuse_expression_element_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "xml_multiuse_expression_element"
    // PLSQL_DMLParser.g:1260:1: xml_multiuse_expression_element : expression ( as_key ( id_expression | evalname_key concatenation ) )? -> {mode == 1}? ^( XML_ELEMENT ^( EXPR expression ) ^( XML_ALIAS[$as_key.start] id_expression ) ) -> {mode == 2}? ^( XML_ELEMENT ^( EXPR expression ) ^( XML_ALIAS[$as_key.start] ^( evalname_key ^( EXPR concatenation ) ) ) ) -> ^( XML_ELEMENT ^( EXPR expression ) ) ;
    public final PLSQLParser_PLSQL_DMLParser.xml_multiuse_expression_element_return xml_multiuse_expression_element() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.xml_multiuse_expression_element_return retval = new PLSQLParser_PLSQL_DMLParser.xml_multiuse_expression_element_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        PLSQLParser_PLSQL_DMLParser.expression_return expression982 =null;

        PLSQLParser_PLSQLKeys.as_key_return as_key983 =null;

        PLSQLParser_PLSQLCommons.id_expression_return id_expression984 =null;

        PLSQLParser_PLSQLKeys.evalname_key_return evalname_key985 =null;

        PLSQLParser_PLSQL_DMLParser.concatenation_return concatenation986 =null;


        RewriteRuleSubtreeStream stream_expression=new RewriteRuleSubtreeStream(adaptor,"rule expression");
        RewriteRuleSubtreeStream stream_evalname_key=new RewriteRuleSubtreeStream(adaptor,"rule evalname_key");
        RewriteRuleSubtreeStream stream_id_expression=new RewriteRuleSubtreeStream(adaptor,"rule id_expression");
        RewriteRuleSubtreeStream stream_as_key=new RewriteRuleSubtreeStream(adaptor,"rule as_key");
        RewriteRuleSubtreeStream stream_concatenation=new RewriteRuleSubtreeStream(adaptor,"rule concatenation");
            int mode = 0;    
        try {
            // PLSQL_DMLParser.g:1262:5: ( expression ( as_key ( id_expression | evalname_key concatenation ) )? -> {mode == 1}? ^( XML_ELEMENT ^( EXPR expression ) ^( XML_ALIAS[$as_key.start] id_expression ) ) -> {mode == 2}? ^( XML_ELEMENT ^( EXPR expression ) ^( XML_ALIAS[$as_key.start] ^( evalname_key ^( EXPR concatenation ) ) ) ) -> ^( XML_ELEMENT ^( EXPR expression ) ) )
            // PLSQL_DMLParser.g:1262:10: expression ( as_key ( id_expression | evalname_key concatenation ) )?
            {
            pushFollow(FOLLOW_expression_in_xml_multiuse_expression_element13013);
            expression982=expression();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_expression.add(expression982.getTree());

            // PLSQL_DMLParser.g:1262:21: ( as_key ( id_expression | evalname_key concatenation ) )?
            int alt308=2;
            int LA308_0 = input.LA(1);

            if ( (LA308_0==SQL92_RESERVED_AS) ) {
                alt308=1;
            }
            switch (alt308) {
                case 1 :
                    // PLSQL_DMLParser.g:1262:22: as_key ( id_expression | evalname_key concatenation )
                    {
                    pushFollow(FOLLOW_as_key_in_xml_multiuse_expression_element13016);
                    as_key983=gPLSQLParser.as_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_as_key.add(as_key983.getTree());

                    // PLSQL_DMLParser.g:1262:29: ( id_expression | evalname_key concatenation )
                    int alt307=2;
                    int LA307_0 = input.LA(1);

                    if ( (LA307_0==REGULAR_ID) ) {
                        int LA307_1 = input.LA(2);

                        if ( (LA307_1==COMMA||LA307_1==RIGHT_PAREN) ) {
                            alt307=1;
                        }
                        else if ( (LA307_1==APPROXIMATE_NUM_LIT||(LA307_1 >= CHAR_STRING && LA307_1 <= COLON)||LA307_1==DELIMITED_ID||LA307_1==EXACT_NUM_LIT||LA307_1==INTRODUCER||LA307_1==LEFT_PAREN||LA307_1==MINUS_SIGN||LA307_1==PLUS_SIGN||LA307_1==REGULAR_ID||LA307_1==SQL92_RESERVED_ALL||LA307_1==SQL92_RESERVED_ANY||LA307_1==SQL92_RESERVED_CASE||LA307_1==SQL92_RESERVED_DEFAULT||LA307_1==SQL92_RESERVED_DISTINCT||(LA307_1 >= SQL92_RESERVED_EXISTS && LA307_1 <= SQL92_RESERVED_FALSE)||LA307_1==SQL92_RESERVED_NULL||LA307_1==SQL92_RESERVED_PRIOR||LA307_1==SQL92_RESERVED_TRUE||LA307_1==UNSIGNED_INTEGER) && ((input.LT(1).getText().equalsIgnoreCase("evalname")))) {
                            alt307=2;
                        }
                        else {
                            if (state.backtracking>0) {state.failed=true; return retval;}
                            NoViableAltException nvae =
                                new NoViableAltException("", 307, 1, input);

                            throw nvae;

                        }
                    }
                    else if ( (LA307_0==DELIMITED_ID) ) {
                        alt307=1;
                    }
                    else {
                        if (state.backtracking>0) {state.failed=true; return retval;}
                        NoViableAltException nvae =
                            new NoViableAltException("", 307, 0, input);

                        throw nvae;

                    }
                    switch (alt307) {
                        case 1 :
                            // PLSQL_DMLParser.g:1262:30: id_expression
                            {
                            pushFollow(FOLLOW_id_expression_in_xml_multiuse_expression_element13019);
                            id_expression984=gPLSQLParser.id_expression();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) stream_id_expression.add(id_expression984.getTree());

                            if ( state.backtracking==0 ) {mode = 1;}

                            }
                            break;
                        case 2 :
                            // PLSQL_DMLParser.g:1262:56: evalname_key concatenation
                            {
                            pushFollow(FOLLOW_evalname_key_in_xml_multiuse_expression_element13023);
                            evalname_key985=gPLSQLParser.evalname_key();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) stream_evalname_key.add(evalname_key985.getTree());

                            pushFollow(FOLLOW_concatenation_in_xml_multiuse_expression_element13025);
                            concatenation986=concatenation();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) stream_concatenation.add(concatenation986.getTree());

                            if ( state.backtracking==0 ) {mode = 2;}

                            }
                            break;

                    }


                    }
                    break;

            }


            // AST REWRITE
            // elements: concatenation, id_expression, expression, expression, evalname_key, expression
            // token labels: 
            // rule labels: retval
            // token list labels: 
            // rule list labels: 
            // wildcard labels: 
            if ( state.backtracking==0 ) {

            retval.tree = root_0;
            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

            root_0 = (Object)adaptor.nil();
            // 1263:9: -> {mode == 1}? ^( XML_ELEMENT ^( EXPR expression ) ^( XML_ALIAS[$as_key.start] id_expression ) )
            if (mode == 1) {
                // PLSQL_DMLParser.g:1263:25: ^( XML_ELEMENT ^( EXPR expression ) ^( XML_ALIAS[$as_key.start] id_expression ) )
                {
                Object root_1 = (Object)adaptor.nil();
                root_1 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(XML_ELEMENT, "XML_ELEMENT")
                , root_1);

                // PLSQL_DMLParser.g:1263:39: ^( EXPR expression )
                {
                Object root_2 = (Object)adaptor.nil();
                root_2 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(EXPR, "EXPR")
                , root_2);

                adaptor.addChild(root_2, stream_expression.nextTree());

                adaptor.addChild(root_1, root_2);
                }

                // PLSQL_DMLParser.g:1263:58: ^( XML_ALIAS[$as_key.start] id_expression )
                {
                Object root_2 = (Object)adaptor.nil();
                root_2 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(XML_ALIAS, (as_key983!=null?((Token)as_key983.start):null))
                , root_2);

                adaptor.addChild(root_2, stream_id_expression.nextTree());

                adaptor.addChild(root_1, root_2);
                }

                adaptor.addChild(root_0, root_1);
                }

            }

            else // 1264:9: -> {mode == 2}? ^( XML_ELEMENT ^( EXPR expression ) ^( XML_ALIAS[$as_key.start] ^( evalname_key ^( EXPR concatenation ) ) ) )
            if (mode == 2) {
                // PLSQL_DMLParser.g:1264:25: ^( XML_ELEMENT ^( EXPR expression ) ^( XML_ALIAS[$as_key.start] ^( evalname_key ^( EXPR concatenation ) ) ) )
                {
                Object root_1 = (Object)adaptor.nil();
                root_1 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(XML_ELEMENT, "XML_ELEMENT")
                , root_1);

                // PLSQL_DMLParser.g:1264:39: ^( EXPR expression )
                {
                Object root_2 = (Object)adaptor.nil();
                root_2 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(EXPR, "EXPR")
                , root_2);

                adaptor.addChild(root_2, stream_expression.nextTree());

                adaptor.addChild(root_1, root_2);
                }

                // PLSQL_DMLParser.g:1264:58: ^( XML_ALIAS[$as_key.start] ^( evalname_key ^( EXPR concatenation ) ) )
                {
                Object root_2 = (Object)adaptor.nil();
                root_2 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(XML_ALIAS, (as_key983!=null?((Token)as_key983.start):null))
                , root_2);

                // PLSQL_DMLParser.g:1264:85: ^( evalname_key ^( EXPR concatenation ) )
                {
                Object root_3 = (Object)adaptor.nil();
                root_3 = (Object)adaptor.becomeRoot(stream_evalname_key.nextNode(), root_3);

                // PLSQL_DMLParser.g:1264:100: ^( EXPR concatenation )
                {
                Object root_4 = (Object)adaptor.nil();
                root_4 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(EXPR, "EXPR")
                , root_4);

                adaptor.addChild(root_4, stream_concatenation.nextTree());

                adaptor.addChild(root_3, root_4);
                }

                adaptor.addChild(root_2, root_3);
                }

                adaptor.addChild(root_1, root_2);
                }

                adaptor.addChild(root_0, root_1);
                }

            }

            else // 1265:9: -> ^( XML_ELEMENT ^( EXPR expression ) )
            {
                // PLSQL_DMLParser.g:1265:12: ^( XML_ELEMENT ^( EXPR expression ) )
                {
                Object root_1 = (Object)adaptor.nil();
                root_1 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(XML_ELEMENT, "XML_ELEMENT")
                , root_1);

                // PLSQL_DMLParser.g:1265:26: ^( EXPR expression )
                {
                Object root_2 = (Object)adaptor.nil();
                root_2 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(EXPR, "EXPR")
                , root_2);

                adaptor.addChild(root_2, stream_expression.nextTree());

                adaptor.addChild(root_1, root_2);
                }

                adaptor.addChild(root_0, root_1);
                }

            }


            retval.tree = root_0;
            }

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "xml_multiuse_expression_element"


    public static class xmlroot_param_version_part_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "xmlroot_param_version_part"
    // PLSQL_DMLParser.g:1268:1: xmlroot_param_version_part : version_key ^ ( no_key value_key | expression_wrapper ) ;
    public final PLSQLParser_PLSQL_DMLParser.xmlroot_param_version_part_return xmlroot_param_version_part() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.xmlroot_param_version_part_return retval = new PLSQLParser_PLSQL_DMLParser.xmlroot_param_version_part_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        PLSQLParser_PLSQLKeys.version_key_return version_key987 =null;

        PLSQLParser_PLSQLKeys.no_key_return no_key988 =null;

        PLSQLParser_PLSQLKeys.value_key_return value_key989 =null;

        PLSQLParser_PLSQL_DMLParser.expression_wrapper_return expression_wrapper990 =null;



        try {
            // PLSQL_DMLParser.g:1269:5: ( version_key ^ ( no_key value_key | expression_wrapper ) )
            // PLSQL_DMLParser.g:1269:10: version_key ^ ( no_key value_key | expression_wrapper )
            {
            root_0 = (Object)adaptor.nil();


            pushFollow(FOLLOW_version_key_in_xmlroot_param_version_part13136);
            version_key987=gPLSQLParser.version_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) root_0 = (Object)adaptor.becomeRoot(version_key987.getTree(), root_0);

            // PLSQL_DMLParser.g:1269:23: ( no_key value_key | expression_wrapper )
            int alt309=2;
            int LA309_0 = input.LA(1);

            if ( (LA309_0==REGULAR_ID) ) {
                int LA309_1 = input.LA(2);

                if ( (LA309_1==REGULAR_ID) ) {
                    int LA309_3 = input.LA(3);

                    if ( ((input.LT(1).getText().equalsIgnoreCase("no"))) ) {
                        alt309=1;
                    }
                    else if ( (true) ) {
                        alt309=2;
                    }
                    else {
                        if (state.backtracking>0) {state.failed=true; return retval;}
                        NoViableAltException nvae =
                            new NoViableAltException("", 309, 3, input);

                        throw nvae;

                    }
                }
                else if ( (LA309_1==MINUS_SIGN||LA309_1==PLUS_SIGN) ) {
                    alt309=2;
                }
                else if ( (LA309_1==DELIMITED_ID||LA309_1==SQL92_RESERVED_ALL||LA309_1==SQL92_RESERVED_DISTINCT||LA309_1==SQL92_RESERVED_PRIOR) && ((((input.LT(1).getText().equalsIgnoreCase("new") && !input.LT(2).getText().equals("."))&&(input.LT(1).getText().equalsIgnoreCase("new") && !input.LT(2).getText().equals(".")))&&(input.LT(1).getText().equalsIgnoreCase("new"))))) {
                    alt309=2;
                }
                else if ( (LA309_1==SQL92_RESERVED_CASE) ) {
                    alt309=2;
                }
                else if ( (LA309_1==APPROXIMATE_NUM_LIT||LA309_1==CHAR_STRING||LA309_1==EXACT_NUM_LIT||LA309_1==INTRODUCER||LA309_1==SQL92_RESERVED_ANY||LA309_1==SQL92_RESERVED_DEFAULT||(LA309_1 >= SQL92_RESERVED_EXISTS && LA309_1 <= SQL92_RESERVED_FALSE)||LA309_1==SQL92_RESERVED_NULL||LA309_1==SQL92_RESERVED_TRUE||LA309_1==UNSIGNED_INTEGER) && ((((input.LT(1).getText().equalsIgnoreCase("new") && !input.LT(2).getText().equals("."))&&(input.LT(1).getText().equalsIgnoreCase("new") && !input.LT(2).getText().equals(".")))&&(input.LT(1).getText().equalsIgnoreCase("new"))))) {
                    alt309=2;
                }
                else if ( (LA309_1==ASTERISK||(LA309_1 >= COLON && LA309_1 <= COMMA)||LA309_1==CONCATENATION_OP||LA309_1==EQUALS_OP||(LA309_1 >= GREATER_THAN_OP && LA309_1 <= GREATER_THAN_OR_EQUALS_OP)||(LA309_1 >= LEFT_BRACKET && LA309_1 <= LESS_THAN_OR_EQUALS_OP)||LA309_1==NOT_EQUAL_OP||LA309_1==PERIOD||LA309_1==RIGHT_PAREN||LA309_1==SOLIDUS||LA309_1==SQL92_RESERVED_AND||LA309_1==SQL92_RESERVED_BETWEEN||LA309_1==SQL92_RESERVED_IN||(LA309_1 >= SQL92_RESERVED_IS && LA309_1 <= SQL92_RESERVED_NOT)||LA309_1==SQL92_RESERVED_OR) ) {
                    alt309=2;
                }
                else {
                    if (state.backtracking>0) {state.failed=true; return retval;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 309, 1, input);

                    throw nvae;

                }
            }
            else if ( (LA309_0==APPROXIMATE_NUM_LIT||(LA309_0 >= CHAR_STRING && LA309_0 <= COLON)||LA309_0==DELIMITED_ID||LA309_0==EXACT_NUM_LIT||LA309_0==INTRODUCER||LA309_0==LEFT_PAREN||LA309_0==MINUS_SIGN||LA309_0==PLUS_SIGN||LA309_0==SQL92_RESERVED_ALL||LA309_0==SQL92_RESERVED_ANY||LA309_0==SQL92_RESERVED_CASE||LA309_0==SQL92_RESERVED_DEFAULT||LA309_0==SQL92_RESERVED_DISTINCT||(LA309_0 >= SQL92_RESERVED_EXISTS && LA309_0 <= SQL92_RESERVED_FALSE)||(LA309_0 >= SQL92_RESERVED_NOT && LA309_0 <= SQL92_RESERVED_NULL)||LA309_0==SQL92_RESERVED_PRIOR||LA309_0==SQL92_RESERVED_TRUE||LA309_0==UNSIGNED_INTEGER) ) {
                alt309=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return retval;}
                NoViableAltException nvae =
                    new NoViableAltException("", 309, 0, input);

                throw nvae;

            }
            switch (alt309) {
                case 1 :
                    // PLSQL_DMLParser.g:1269:24: no_key value_key
                    {
                    pushFollow(FOLLOW_no_key_in_xmlroot_param_version_part13140);
                    no_key988=gPLSQLParser.no_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, no_key988.getTree());

                    pushFollow(FOLLOW_value_key_in_xmlroot_param_version_part13142);
                    value_key989=gPLSQLParser.value_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, value_key989.getTree());

                    }
                    break;
                case 2 :
                    // PLSQL_DMLParser.g:1269:41: expression_wrapper
                    {
                    pushFollow(FOLLOW_expression_wrapper_in_xmlroot_param_version_part13144);
                    expression_wrapper990=expression_wrapper();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, expression_wrapper990.getTree());

                    }
                    break;

            }


            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "xmlroot_param_version_part"


    public static class xmlroot_param_standalone_part_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "xmlroot_param_standalone_part"
    // PLSQL_DMLParser.g:1272:1: xmlroot_param_standalone_part : standalone_key ^ ( yes_key | no_key ( value_key )? ) ;
    public final PLSQLParser_PLSQL_DMLParser.xmlroot_param_standalone_part_return xmlroot_param_standalone_part() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.xmlroot_param_standalone_part_return retval = new PLSQLParser_PLSQL_DMLParser.xmlroot_param_standalone_part_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        PLSQLParser_PLSQLKeys.standalone_key_return standalone_key991 =null;

        PLSQLParser_PLSQLKeys.yes_key_return yes_key992 =null;

        PLSQLParser_PLSQLKeys.no_key_return no_key993 =null;

        PLSQLParser_PLSQLKeys.value_key_return value_key994 =null;



        try {
            // PLSQL_DMLParser.g:1273:5: ( standalone_key ^ ( yes_key | no_key ( value_key )? ) )
            // PLSQL_DMLParser.g:1273:10: standalone_key ^ ( yes_key | no_key ( value_key )? )
            {
            root_0 = (Object)adaptor.nil();


            pushFollow(FOLLOW_standalone_key_in_xmlroot_param_standalone_part13165);
            standalone_key991=gPLSQLParser.standalone_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) root_0 = (Object)adaptor.becomeRoot(standalone_key991.getTree(), root_0);

            // PLSQL_DMLParser.g:1273:26: ( yes_key | no_key ( value_key )? )
            int alt311=2;
            int LA311_0 = input.LA(1);

            if ( (LA311_0==REGULAR_ID) && (((input.LT(1).getText().equalsIgnoreCase("no"))||(input.LT(1).getText().equalsIgnoreCase("yes"))))) {
                int LA311_1 = input.LA(2);

                if ( ((input.LT(1).getText().equalsIgnoreCase("yes"))) ) {
                    alt311=1;
                }
                else if ( ((input.LT(1).getText().equalsIgnoreCase("no"))) ) {
                    alt311=2;
                }
                else {
                    if (state.backtracking>0) {state.failed=true; return retval;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 311, 1, input);

                    throw nvae;

                }
            }
            else {
                if (state.backtracking>0) {state.failed=true; return retval;}
                NoViableAltException nvae =
                    new NoViableAltException("", 311, 0, input);

                throw nvae;

            }
            switch (alt311) {
                case 1 :
                    // PLSQL_DMLParser.g:1273:27: yes_key
                    {
                    pushFollow(FOLLOW_yes_key_in_xmlroot_param_standalone_part13169);
                    yes_key992=gPLSQLParser.yes_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, yes_key992.getTree());

                    }
                    break;
                case 2 :
                    // PLSQL_DMLParser.g:1273:35: no_key ( value_key )?
                    {
                    pushFollow(FOLLOW_no_key_in_xmlroot_param_standalone_part13171);
                    no_key993=gPLSQLParser.no_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, no_key993.getTree());

                    // PLSQL_DMLParser.g:1273:42: ( value_key )?
                    int alt310=2;
                    int LA310_0 = input.LA(1);

                    if ( (LA310_0==REGULAR_ID) ) {
                        alt310=1;
                    }
                    switch (alt310) {
                        case 1 :
                            // PLSQL_DMLParser.g:1273:42: value_key
                            {
                            pushFollow(FOLLOW_value_key_in_xmlroot_param_standalone_part13173);
                            value_key994=gPLSQLParser.value_key();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) adaptor.addChild(root_0, value_key994.getTree());

                            }
                            break;

                    }


                    }
                    break;

            }


            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "xmlroot_param_standalone_part"


    public static class xmlserialize_param_enconding_part_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "xmlserialize_param_enconding_part"
    // PLSQL_DMLParser.g:1276:1: xmlserialize_param_enconding_part : encoding_key ^ concatenation_wrapper ;
    public final PLSQLParser_PLSQL_DMLParser.xmlserialize_param_enconding_part_return xmlserialize_param_enconding_part() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.xmlserialize_param_enconding_part_return retval = new PLSQLParser_PLSQL_DMLParser.xmlserialize_param_enconding_part_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        PLSQLParser_PLSQLKeys.encoding_key_return encoding_key995 =null;

        PLSQLParser_PLSQL_DMLParser.concatenation_wrapper_return concatenation_wrapper996 =null;



        try {
            // PLSQL_DMLParser.g:1277:5: ( encoding_key ^ concatenation_wrapper )
            // PLSQL_DMLParser.g:1277:10: encoding_key ^ concatenation_wrapper
            {
            root_0 = (Object)adaptor.nil();


            pushFollow(FOLLOW_encoding_key_in_xmlserialize_param_enconding_part13195);
            encoding_key995=gPLSQLParser.encoding_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) root_0 = (Object)adaptor.becomeRoot(encoding_key995.getTree(), root_0);

            pushFollow(FOLLOW_concatenation_wrapper_in_xmlserialize_param_enconding_part13198);
            concatenation_wrapper996=concatenation_wrapper();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) adaptor.addChild(root_0, concatenation_wrapper996.getTree());

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "xmlserialize_param_enconding_part"


    public static class xmlserialize_param_version_part_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "xmlserialize_param_version_part"
    // PLSQL_DMLParser.g:1280:1: xmlserialize_param_version_part : version_key ^ concatenation_wrapper ;
    public final PLSQLParser_PLSQL_DMLParser.xmlserialize_param_version_part_return xmlserialize_param_version_part() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.xmlserialize_param_version_part_return retval = new PLSQLParser_PLSQL_DMLParser.xmlserialize_param_version_part_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        PLSQLParser_PLSQLKeys.version_key_return version_key997 =null;

        PLSQLParser_PLSQL_DMLParser.concatenation_wrapper_return concatenation_wrapper998 =null;



        try {
            // PLSQL_DMLParser.g:1281:5: ( version_key ^ concatenation_wrapper )
            // PLSQL_DMLParser.g:1281:10: version_key ^ concatenation_wrapper
            {
            root_0 = (Object)adaptor.nil();


            pushFollow(FOLLOW_version_key_in_xmlserialize_param_version_part13218);
            version_key997=gPLSQLParser.version_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) root_0 = (Object)adaptor.becomeRoot(version_key997.getTree(), root_0);

            pushFollow(FOLLOW_concatenation_wrapper_in_xmlserialize_param_version_part13221);
            concatenation_wrapper998=concatenation_wrapper();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) adaptor.addChild(root_0, concatenation_wrapper998.getTree());

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "xmlserialize_param_version_part"


    public static class xmlserialize_param_ident_part_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "xmlserialize_param_ident_part"
    // PLSQL_DMLParser.g:1284:1: xmlserialize_param_ident_part : ( no_key indent_key | indent_key ^ ( size_key ! EQUALS_OP ! concatenation_wrapper )? );
    public final PLSQLParser_PLSQL_DMLParser.xmlserialize_param_ident_part_return xmlserialize_param_ident_part() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.xmlserialize_param_ident_part_return retval = new PLSQLParser_PLSQL_DMLParser.xmlserialize_param_ident_part_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token EQUALS_OP1003=null;
        PLSQLParser_PLSQLKeys.no_key_return no_key999 =null;

        PLSQLParser_PLSQLKeys.indent_key_return indent_key1000 =null;

        PLSQLParser_PLSQLKeys.indent_key_return indent_key1001 =null;

        PLSQLParser_PLSQLKeys.size_key_return size_key1002 =null;

        PLSQLParser_PLSQL_DMLParser.concatenation_wrapper_return concatenation_wrapper1004 =null;


        Object EQUALS_OP1003_tree=null;

        try {
            // PLSQL_DMLParser.g:1285:5: ( no_key indent_key | indent_key ^ ( size_key ! EQUALS_OP ! concatenation_wrapper )? )
            int alt313=2;
            int LA313_0 = input.LA(1);

            if ( (LA313_0==REGULAR_ID) && (((input.LT(1).getText().equalsIgnoreCase("no"))||(input.LT(1).getText().equalsIgnoreCase("indent"))))) {
                int LA313_1 = input.LA(2);

                if ( (LA313_1==REGULAR_ID) && (((input.LT(1).getText().equalsIgnoreCase("no"))||(input.LT(1).getText().equalsIgnoreCase("indent"))))) {
                    int LA313_2 = input.LA(3);

                    if ( (LA313_2==REGULAR_ID) && (((input.LT(1).getText().equalsIgnoreCase("no"))||(input.LT(1).getText().equalsIgnoreCase("indent"))))) {
                        int LA313_4 = input.LA(4);

                        if ( (LA313_4==REGULAR_ID) && ((input.LT(1).getText().equalsIgnoreCase("no")))) {
                            alt313=1;
                        }
                        else if ( (LA313_4==RIGHT_PAREN) && ((input.LT(1).getText().equalsIgnoreCase("indent")))) {
                            alt313=2;
                        }
                        else {
                            if (state.backtracking>0) {state.failed=true; return retval;}
                            NoViableAltException nvae =
                                new NoViableAltException("", 313, 4, input);

                            throw nvae;

                        }
                    }
                    else if ( (LA313_2==RIGHT_PAREN) && ((input.LT(1).getText().equalsIgnoreCase("no")))) {
                        alt313=1;
                    }
                    else {
                        if (state.backtracking>0) {state.failed=true; return retval;}
                        NoViableAltException nvae =
                            new NoViableAltException("", 313, 2, input);

                        throw nvae;

                    }
                }
                else if ( (LA313_1==RIGHT_PAREN||LA313_1==SQL92_RESERVED_SIZE) && ((input.LT(1).getText().equalsIgnoreCase("indent")))) {
                    alt313=2;
                }
                else {
                    if (state.backtracking>0) {state.failed=true; return retval;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 313, 1, input);

                    throw nvae;

                }
            }
            else {
                if (state.backtracking>0) {state.failed=true; return retval;}
                NoViableAltException nvae =
                    new NoViableAltException("", 313, 0, input);

                throw nvae;

            }
            switch (alt313) {
                case 1 :
                    // PLSQL_DMLParser.g:1285:10: no_key indent_key
                    {
                    root_0 = (Object)adaptor.nil();


                    pushFollow(FOLLOW_no_key_in_xmlserialize_param_ident_part13241);
                    no_key999=gPLSQLParser.no_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, no_key999.getTree());

                    pushFollow(FOLLOW_indent_key_in_xmlserialize_param_ident_part13243);
                    indent_key1000=gPLSQLParser.indent_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, indent_key1000.getTree());

                    }
                    break;
                case 2 :
                    // PLSQL_DMLParser.g:1286:10: indent_key ^ ( size_key ! EQUALS_OP ! concatenation_wrapper )?
                    {
                    root_0 = (Object)adaptor.nil();


                    pushFollow(FOLLOW_indent_key_in_xmlserialize_param_ident_part13254);
                    indent_key1001=gPLSQLParser.indent_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) root_0 = (Object)adaptor.becomeRoot(indent_key1001.getTree(), root_0);

                    // PLSQL_DMLParser.g:1286:22: ( size_key ! EQUALS_OP ! concatenation_wrapper )?
                    int alt312=2;
                    int LA312_0 = input.LA(1);

                    if ( (LA312_0==SQL92_RESERVED_SIZE) ) {
                        alt312=1;
                    }
                    switch (alt312) {
                        case 1 :
                            // PLSQL_DMLParser.g:1286:23: size_key ! EQUALS_OP ! concatenation_wrapper
                            {
                            pushFollow(FOLLOW_size_key_in_xmlserialize_param_ident_part13258);
                            size_key1002=gPLSQLParser.size_key();

                            state._fsp--;
                            if (state.failed) return retval;

                            EQUALS_OP1003=(Token)match(input,EQUALS_OP,FOLLOW_EQUALS_OP_in_xmlserialize_param_ident_part13261); if (state.failed) return retval;

                            pushFollow(FOLLOW_concatenation_wrapper_in_xmlserialize_param_ident_part13264);
                            concatenation_wrapper1004=concatenation_wrapper();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) adaptor.addChild(root_0, concatenation_wrapper1004.getTree());

                            }
                            break;

                    }


                    }
                    break;

            }
            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "xmlserialize_param_ident_part"

    // $ANTLR start synpred1_PLSQL_DMLParser
    public final void synpred1_PLSQL_DMLParser_fragment() throws RecognitionException {
        // PLSQL_DMLParser.g:190:28: ( order_key ( siblings_key )? by_key )
        // PLSQL_DMLParser.g:190:29: order_key ( siblings_key )? by_key
        {
        pushFollow(FOLLOW_order_key_in_synpred1_PLSQL_DMLParser710);
        gPLSQLParser.order_key();

        state._fsp--;
        if (state.failed) return ;

        // PLSQL_DMLParser.g:190:39: ( siblings_key )?
        int alt314=2;
        int LA314_0 = input.LA(1);

        if ( (LA314_0==REGULAR_ID) && ((input.LT(1).getText().equalsIgnoreCase("siblings")))) {
            alt314=1;
        }
        switch (alt314) {
            case 1 :
                // PLSQL_DMLParser.g:190:39: siblings_key
                {
                pushFollow(FOLLOW_siblings_key_in_synpred1_PLSQL_DMLParser712);
                gPLSQLParser.siblings_key();

                state._fsp--;
                if (state.failed) return ;

                }
                break;

        }


        pushFollow(FOLLOW_by_key_in_synpred1_PLSQL_DMLParser715);
        gPLSQLParser.by_key();

        state._fsp--;
        if (state.failed) return ;

        }

    }
    // $ANTLR end synpred1_PLSQL_DMLParser

    // $ANTLR start synpred2_PLSQL_DMLParser
    public final void synpred2_PLSQL_DMLParser_fragment() throws RecognitionException {
        // PLSQL_DMLParser.g:221:10: ( distinct_key | unique_key | all_key )
        int alt315=3;
        switch ( input.LA(1) ) {
        case SQL92_RESERVED_DISTINCT:
            {
            alt315=1;
            }
            break;
        case SQL92_RESERVED_UNIQUE:
            {
            alt315=2;
            }
            break;
        case SQL92_RESERVED_ALL:
            {
            alt315=3;
            }
            break;
        default:
            if (state.backtracking>0) {state.failed=true; return ;}
            NoViableAltException nvae =
                new NoViableAltException("", 315, 0, input);

            throw nvae;

        }

        switch (alt315) {
            case 1 :
                // PLSQL_DMLParser.g:221:11: distinct_key
                {
                pushFollow(FOLLOW_distinct_key_in_synpred2_PLSQL_DMLParser979);
                gPLSQLParser.distinct_key();

                state._fsp--;
                if (state.failed) return ;

                }
                break;
            case 2 :
                // PLSQL_DMLParser.g:221:24: unique_key
                {
                pushFollow(FOLLOW_unique_key_in_synpred2_PLSQL_DMLParser981);
                gPLSQLParser.unique_key();

                state._fsp--;
                if (state.failed) return ;

                }
                break;
            case 3 :
                // PLSQL_DMLParser.g:221:35: all_key
                {
                pushFollow(FOLLOW_all_key_in_synpred2_PLSQL_DMLParser983);
                gPLSQLParser.all_key();

                state._fsp--;
                if (state.failed) return ;

                }
                break;

        }
    }
    // $ANTLR end synpred2_PLSQL_DMLParser

    // $ANTLR start synpred3_PLSQL_DMLParser
    public final void synpred3_PLSQL_DMLParser_fragment() throws RecognitionException {
        // PLSQL_DMLParser.g:246:10: ( tableview_name PERIOD ASTERISK )
        // PLSQL_DMLParser.g:246:11: tableview_name PERIOD ASTERISK
        {
        pushFollow(FOLLOW_tableview_name_in_synpred3_PLSQL_DMLParser1316);
        gPLSQLParser.tableview_name();

        state._fsp--;
        if (state.failed) return ;

        match(input,PERIOD,FOLLOW_PERIOD_in_synpred3_PLSQL_DMLParser1318); if (state.failed) return ;

        match(input,ASTERISK,FOLLOW_ASTERISK_in_synpred3_PLSQL_DMLParser1320); if (state.failed) return ;

        }

    }
    // $ANTLR end synpred3_PLSQL_DMLParser

    // $ANTLR start synpred4_PLSQL_DMLParser
    public final void synpred4_PLSQL_DMLParser_fragment() throws RecognitionException {
        // PLSQL_DMLParser.g:300:10: ( LEFT_PAREN )
        // PLSQL_DMLParser.g:300:11: LEFT_PAREN
        {
        match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_synpred4_PLSQL_DMLParser1863); if (state.failed) return ;

        }

    }
    // $ANTLR end synpred4_PLSQL_DMLParser

    // $ANTLR start synpred5_PLSQL_DMLParser
    public final void synpred5_PLSQL_DMLParser_fragment() throws RecognitionException {
        // PLSQL_DMLParser.g:338:18: ( select_key )
        // PLSQL_DMLParser.g:338:19: select_key
        {
        pushFollow(FOLLOW_select_key_in_synpred5_PLSQL_DMLParser2326);
        gPLSQLParser.select_key();

        state._fsp--;
        if (state.failed) return ;

        }

    }
    // $ANTLR end synpred5_PLSQL_DMLParser

    // $ANTLR start synpred6_PLSQL_DMLParser
    public final void synpred6_PLSQL_DMLParser_fragment() throws RecognitionException {
        // PLSQL_DMLParser.g:339:18: ( any_key )
        // PLSQL_DMLParser.g:339:19: any_key
        {
        pushFollow(FOLLOW_any_key_in_synpred6_PLSQL_DMLParser2352);
        gPLSQLParser.any_key();

        state._fsp--;
        if (state.failed) return ;

        }

    }
    // $ANTLR end synpred6_PLSQL_DMLParser

    // $ANTLR start synpred7_PLSQL_DMLParser
    public final void synpred7_PLSQL_DMLParser_fragment() throws RecognitionException {
        // PLSQL_DMLParser.g:355:10: ( LEFT_PAREN )
        // PLSQL_DMLParser.g:355:11: LEFT_PAREN
        {
        match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_synpred7_PLSQL_DMLParser2557); if (state.failed) return ;

        }

    }
    // $ANTLR end synpred7_PLSQL_DMLParser

    // $ANTLR start synpred8_PLSQL_DMLParser
    public final void synpred8_PLSQL_DMLParser_fragment() throws RecognitionException {
        // PLSQL_DMLParser.g:385:14: ( LEFT_PAREN )
        // PLSQL_DMLParser.g:385:15: LEFT_PAREN
        {
        match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_synpred8_PLSQL_DMLParser2927); if (state.failed) return ;

        }

    }
    // $ANTLR end synpred8_PLSQL_DMLParser

    // $ANTLR start synpred9_PLSQL_DMLParser
    public final void synpred9_PLSQL_DMLParser_fragment() throws RecognitionException {
        // PLSQL_DMLParser.g:403:46: ( COMMA group_by_elements )
        // PLSQL_DMLParser.g:403:47: COMMA group_by_elements
        {
        match(input,COMMA,FOLLOW_COMMA_in_synpred9_PLSQL_DMLParser3145); if (state.failed) return ;

        pushFollow(FOLLOW_group_by_elements_in_synpred9_PLSQL_DMLParser3147);
        group_by_elements();

        state._fsp--;
        if (state.failed) return ;

        }

    }
    // $ANTLR end synpred9_PLSQL_DMLParser

    // $ANTLR start synpred10_PLSQL_DMLParser
    public final void synpred10_PLSQL_DMLParser_fragment() throws RecognitionException {
        // PLSQL_DMLParser.g:424:10: ( rollup_key | cube_key )
        int alt316=2;
        int LA316_0 = input.LA(1);

        if ( (LA316_0==REGULAR_ID) && (((input.LT(1).getText().equalsIgnoreCase("cube"))||(input.LT(1).getText().equalsIgnoreCase("rollup"))))) {
            int LA316_1 = input.LA(2);

            if ( ((input.LT(1).getText().equalsIgnoreCase("rollup"))) ) {
                alt316=1;
            }
            else if ( ((input.LT(1).getText().equalsIgnoreCase("cube"))) ) {
                alt316=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return ;}
                NoViableAltException nvae =
                    new NoViableAltException("", 316, 1, input);

                throw nvae;

            }
        }
        else {
            if (state.backtracking>0) {state.failed=true; return ;}
            NoViableAltException nvae =
                new NoViableAltException("", 316, 0, input);

            throw nvae;

        }
        switch (alt316) {
            case 1 :
                // PLSQL_DMLParser.g:424:11: rollup_key
                {
                pushFollow(FOLLOW_rollup_key_in_synpred10_PLSQL_DMLParser3356);
                gPLSQLParser.rollup_key();

                state._fsp--;
                if (state.failed) return ;

                }
                break;
            case 2 :
                // PLSQL_DMLParser.g:424:22: cube_key
                {
                pushFollow(FOLLOW_cube_key_in_synpred10_PLSQL_DMLParser3358);
                gPLSQLParser.cube_key();

                state._fsp--;
                if (state.failed) return ;

                }
                break;

        }
    }
    // $ANTLR end synpred10_PLSQL_DMLParser

    // $ANTLR start synpred11_PLSQL_DMLParser
    public final void synpred11_PLSQL_DMLParser_fragment() throws RecognitionException {
        // PLSQL_DMLParser.g:425:10: ( LEFT_PAREN )
        // PLSQL_DMLParser.g:425:11: LEFT_PAREN
        {
        match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_synpred11_PLSQL_DMLParser3374); if (state.failed) return ;

        }

    }
    // $ANTLR end synpred11_PLSQL_DMLParser

    // $ANTLR start synpred12_PLSQL_DMLParser
    public final void synpred12_PLSQL_DMLParser_fragment() throws RecognitionException {
        // PLSQL_DMLParser.g:490:34: ( all_key )
        // PLSQL_DMLParser.g:490:35: all_key
        {
        pushFollow(FOLLOW_all_key_in_synpred12_PLSQL_DMLParser4043);
        gPLSQLParser.all_key();

        state._fsp--;
        if (state.failed) return ;

        }

    }
    // $ANTLR end synpred12_PLSQL_DMLParser

    // $ANTLR start synpred13_PLSQL_DMLParser
    public final void synpred13_PLSQL_DMLParser_fragment() throws RecognitionException {
        // PLSQL_DMLParser.g:712:10: ( LEFT_PAREN )
        // PLSQL_DMLParser.g:712:11: LEFT_PAREN
        {
        match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_synpred13_PLSQL_DMLParser6221); if (state.failed) return ;

        }

    }
    // $ANTLR end synpred13_PLSQL_DMLParser

    // $ANTLR start synpred14_PLSQL_DMLParser
    public final void synpred14_PLSQL_DMLParser_fragment() throws RecognitionException {
        // PLSQL_DMLParser.g:722:34: ( unlimited_key )
        // PLSQL_DMLParser.g:722:35: unlimited_key
        {
        pushFollow(FOLLOW_unlimited_key_in_synpred14_PLSQL_DMLParser6312);
        gPLSQLParser.unlimited_key();

        state._fsp--;
        if (state.failed) return ;

        }

    }
    // $ANTLR end synpred14_PLSQL_DMLParser

    // $ANTLR start synpred15_PLSQL_DMLParser
    public final void synpred15_PLSQL_DMLParser_fragment() throws RecognitionException {
        // PLSQL_DMLParser.g:871:22: ( select_key )
        // PLSQL_DMLParser.g:871:23: select_key
        {
        pushFollow(FOLLOW_select_key_in_synpred15_PLSQL_DMLParser8088);
        gPLSQLParser.select_key();

        state._fsp--;
        if (state.failed) return ;

        }

    }
    // $ANTLR end synpred15_PLSQL_DMLParser

    // $ANTLR start synpred16_PLSQL_DMLParser
    public final void synpred16_PLSQL_DMLParser_fragment() throws RecognitionException {
        // PLSQL_DMLParser.g:902:10: ( interval_expression )
        // PLSQL_DMLParser.g:902:11: interval_expression
        {
        pushFollow(FOLLOW_interval_expression_in_synpred16_PLSQL_DMLParser8425);
        interval_expression();

        state._fsp--;
        if (state.failed) return ;

        }

    }
    // $ANTLR end synpred16_PLSQL_DMLParser

    // $ANTLR start synpred17_PLSQL_DMLParser
    public final void synpred17_PLSQL_DMLParser_fragment() throws RecognitionException {
        // PLSQL_DMLParser.g:921:11: ( any_key )
        // PLSQL_DMLParser.g:921:12: any_key
        {
        pushFollow(FOLLOW_any_key_in_synpred17_PLSQL_DMLParser8664);
        gPLSQLParser.any_key();

        state._fsp--;
        if (state.failed) return ;

        }

    }
    // $ANTLR end synpred17_PLSQL_DMLParser

    // $ANTLR start synpred18_PLSQL_DMLParser
    public final void synpred18_PLSQL_DMLParser_fragment() throws RecognitionException {
        // PLSQL_DMLParser.g:921:59: ( any_key )
        // PLSQL_DMLParser.g:921:60: any_key
        {
        pushFollow(FOLLOW_any_key_in_synpred18_PLSQL_DMLParser8679);
        gPLSQLParser.any_key();

        state._fsp--;
        if (state.failed) return ;

        }

    }
    // $ANTLR end synpred18_PLSQL_DMLParser

    // $ANTLR start synpred19_PLSQL_DMLParser
    public final void synpred19_PLSQL_DMLParser_fragment() throws RecognitionException {
        // PLSQL_DMLParser.g:950:18: ( select_key )
        // PLSQL_DMLParser.g:950:19: select_key
        {
        pushFollow(FOLLOW_select_key_in_synpred19_PLSQL_DMLParser9033);
        gPLSQLParser.select_key();

        state._fsp--;
        if (state.failed) return ;

        }

    }
    // $ANTLR end synpred19_PLSQL_DMLParser

    // $ANTLR start synpred20_PLSQL_DMLParser
    public final void synpred20_PLSQL_DMLParser_fragment() throws RecognitionException {
        // PLSQL_DMLParser.g:951:18: ( LEFT_PAREN )
        // PLSQL_DMLParser.g:951:19: LEFT_PAREN
        {
        match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_synpred20_PLSQL_DMLParser9057); if (state.failed) return ;

        }

    }
    // $ANTLR end synpred20_PLSQL_DMLParser

    // $ANTLR start synpred21_PLSQL_DMLParser
    public final void synpred21_PLSQL_DMLParser_fragment() throws RecognitionException {
        // PLSQL_DMLParser.g:984:10: ( ( label_name )? case_key when_key )
        // PLSQL_DMLParser.g:984:11: ( label_name )? case_key when_key
        {
        // PLSQL_DMLParser.g:984:11: ( label_name )?
        int alt317=2;
        int LA317_0 = input.LA(1);

        if ( (LA317_0==DELIMITED_ID||LA317_0==REGULAR_ID) ) {
            alt317=1;
        }
        switch (alt317) {
            case 1 :
                // PLSQL_DMLParser.g:984:11: label_name
                {
                pushFollow(FOLLOW_label_name_in_synpred21_PLSQL_DMLParser9429);
                gPLSQLParser.label_name();

                state._fsp--;
                if (state.failed) return ;

                }
                break;

        }


        pushFollow(FOLLOW_case_key_in_synpred21_PLSQL_DMLParser9432);
        gPLSQLParser.case_key();

        state._fsp--;
        if (state.failed) return ;

        pushFollow(FOLLOW_when_key_in_synpred21_PLSQL_DMLParser9434);
        gPLSQLParser.when_key();

        state._fsp--;
        if (state.failed) return ;

        }

    }
    // $ANTLR end synpred21_PLSQL_DMLParser

    // $ANTLR start synpred22_PLSQL_DMLParser
    public final void synpred22_PLSQL_DMLParser_fragment() throws RecognitionException {
        // PLSQL_DMLParser.g:1022:23: ( select_key )
        // PLSQL_DMLParser.g:1022:24: select_key
        {
        pushFollow(FOLLOW_select_key_in_synpred22_PLSQL_DMLParser9792);
        gPLSQLParser.select_key();

        state._fsp--;
        if (state.failed) return ;

        }

    }
    // $ANTLR end synpred22_PLSQL_DMLParser

    // $ANTLR start synpred23_PLSQL_DMLParser
    public final void synpred23_PLSQL_DMLParser_fragment() throws RecognitionException {
        // PLSQL_DMLParser.g:1244:14: ( default_key )
        // PLSQL_DMLParser.g:1244:15: default_key
        {
        pushFollow(FOLLOW_default_key_in_synpred23_PLSQL_DMLParser12850);
        gPLSQLParser.default_key();

        state._fsp--;
        if (state.failed) return ;

        }

    }
    // $ANTLR end synpred23_PLSQL_DMLParser

    // $ANTLR start synpred24_PLSQL_DMLParser
    public final void synpred24_PLSQL_DMLParser_fragment() throws RecognitionException {
        // PLSQL_DMLParser.g:1251:55: ( default_key )
        // PLSQL_DMLParser.g:1251:56: default_key
        {
        pushFollow(FOLLOW_default_key_in_synpred24_PLSQL_DMLParser12922);
        gPLSQLParser.default_key();

        state._fsp--;
        if (state.failed) return ;

        }

    }
    // $ANTLR end synpred24_PLSQL_DMLParser

    // Delegated rules

    public final boolean synpred11_PLSQL_DMLParser() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred11_PLSQL_DMLParser_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred3_PLSQL_DMLParser() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred3_PLSQL_DMLParser_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred13_PLSQL_DMLParser() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred13_PLSQL_DMLParser_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred20_PLSQL_DMLParser() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred20_PLSQL_DMLParser_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred5_PLSQL_DMLParser() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred5_PLSQL_DMLParser_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred22_PLSQL_DMLParser() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred22_PLSQL_DMLParser_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred1_PLSQL_DMLParser() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred1_PLSQL_DMLParser_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred12_PLSQL_DMLParser() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred12_PLSQL_DMLParser_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred14_PLSQL_DMLParser() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred14_PLSQL_DMLParser_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred21_PLSQL_DMLParser() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred21_PLSQL_DMLParser_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred16_PLSQL_DMLParser() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred16_PLSQL_DMLParser_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred4_PLSQL_DMLParser() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred4_PLSQL_DMLParser_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred7_PLSQL_DMLParser() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred7_PLSQL_DMLParser_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred19_PLSQL_DMLParser() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred19_PLSQL_DMLParser_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred8_PLSQL_DMLParser() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred8_PLSQL_DMLParser_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred9_PLSQL_DMLParser() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred9_PLSQL_DMLParser_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred15_PLSQL_DMLParser() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred15_PLSQL_DMLParser_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred2_PLSQL_DMLParser() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred2_PLSQL_DMLParser_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred6_PLSQL_DMLParser() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred6_PLSQL_DMLParser_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred23_PLSQL_DMLParser() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred23_PLSQL_DMLParser_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred10_PLSQL_DMLParser() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred10_PLSQL_DMLParser_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred18_PLSQL_DMLParser() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred18_PLSQL_DMLParser_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred24_PLSQL_DMLParser() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred24_PLSQL_DMLParser_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred17_PLSQL_DMLParser() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred17_PLSQL_DMLParser_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }


    protected DFA22 dfa22 = new DFA22(this);
    protected DFA27 dfa27 = new DFA27(this);
    protected DFA72 dfa72 = new DFA72(this);
    protected DFA130 dfa130 = new DFA130(this);
    protected DFA151 dfa151 = new DFA151(this);
    protected DFA193 dfa193 = new DFA193(this);
    protected DFA232 dfa232 = new DFA232(this);
    protected DFA263 dfa263 = new DFA263(this);
    static final String DFA22_eotS =
        "\21\uffff";
    static final String DFA22_eofS =
        "\1\1\3\uffff\2\7\6\uffff\3\7\2\uffff";
    static final String DFA22_minS =
        "\1\12\1\uffff\2\17\2\10\1\17\1\uffff\4\17\3\10\2\17";
    static final String DFA22_maxS =
        "\1\u0085\1\uffff\1\172\1\74\3\u0085\1\uffff\4\74\3\u0085\2\74";
    static final String DFA22_acceptS =
        "\1\uffff\1\2\5\uffff\1\1\11\uffff";
    static final String DFA22_specialS =
        "\21\uffff}>";
    static final String[] DFA22_transitionS = {
            "\1\1\1\uffff\1\2\2\uffff\1\1\10\uffff\1\1\1\uffff\1\1\11\uffff"+
            "\1\1\14\uffff\1\1\5\uffff\1\1\4\uffff\1\1\1\uffff\2\1\10\uffff"+
            "\1\1\5\uffff\1\1\1\uffff\1\1\4\uffff\1\1\3\uffff\2\1\4\uffff"+
            "\1\1\3\uffff\2\1\1\uffff\2\1\6\uffff\1\1\2\uffff\1\1\5\uffff"+
            "\1\1\6\uffff\1\1\1\uffff\1\1\2\uffff\3\1",
            "",
            "\1\5\10\uffff\1\3\1\uffff\1\6\41\uffff\1\4\75\uffff\1\7",
            "\1\11\54\uffff\1\10",
            "\1\7\1\uffff\1\7\1\uffff\1\7\2\uffff\1\7\2\uffff\1\1\5\uffff"+
            "\1\7\1\uffff\1\7\7\uffff\1\12\1\uffff\1\7\14\uffff\1\7\5\uffff"+
            "\1\7\4\uffff\1\7\1\uffff\2\7\10\uffff\1\7\5\uffff\1\7\1\uffff"+
            "\1\7\4\uffff\1\7\3\uffff\2\7\4\uffff\1\7\3\uffff\2\7\1\uffff"+
            "\2\7\6\uffff\1\7\2\uffff\1\7\5\uffff\1\7\6\uffff\1\7\1\uffff"+
            "\1\7\2\uffff\3\7",
            "\1\7\1\uffff\1\7\1\uffff\1\7\2\uffff\1\7\2\uffff\1\1\5\uffff"+
            "\1\7\1\uffff\1\7\7\uffff\1\12\1\uffff\1\7\14\uffff\1\7\5\uffff"+
            "\1\7\4\uffff\1\7\1\uffff\2\7\10\uffff\1\7\5\uffff\1\7\1\uffff"+
            "\1\7\4\uffff\1\7\3\uffff\2\7\4\uffff\1\7\3\uffff\2\7\1\uffff"+
            "\2\7\6\uffff\1\7\2\uffff\1\7\5\uffff\1\7\6\uffff\1\7\1\uffff"+
            "\1\7\2\uffff\3\7",
            "\1\1\10\uffff\1\1\1\uffff\1\7\41\uffff\1\1\72\uffff\1\7\15"+
            "\uffff\1\7",
            "",
            "\1\5\22\uffff\1\13\31\uffff\1\14",
            "\1\5\22\uffff\1\13\31\uffff\1\14",
            "\1\16\54\uffff\1\15",
            "\1\20\54\uffff\1\17",
            "\1\7\1\uffff\1\7\1\uffff\1\7\2\uffff\1\7\2\uffff\1\1\5\uffff"+
            "\1\7\1\uffff\1\7\7\uffff\1\12\1\uffff\1\7\14\uffff\1\7\5\uffff"+
            "\1\7\4\uffff\1\7\1\uffff\2\7\10\uffff\1\7\5\uffff\1\7\1\uffff"+
            "\1\7\4\uffff\1\7\3\uffff\2\7\4\uffff\1\7\3\uffff\2\7\1\uffff"+
            "\2\7\6\uffff\1\7\2\uffff\1\7\5\uffff\1\7\6\uffff\1\7\1\uffff"+
            "\1\7\2\uffff\3\7",
            "\1\7\1\uffff\1\7\1\uffff\1\7\2\uffff\1\7\2\uffff\1\1\5\uffff"+
            "\1\7\1\uffff\1\7\7\uffff\1\1\1\uffff\1\7\14\uffff\1\7\5\uffff"+
            "\1\7\4\uffff\1\7\1\uffff\2\7\10\uffff\1\7\5\uffff\1\7\1\uffff"+
            "\1\7\4\uffff\1\7\3\uffff\2\7\4\uffff\1\7\3\uffff\2\7\1\uffff"+
            "\2\7\6\uffff\1\7\2\uffff\1\7\5\uffff\1\7\6\uffff\1\7\1\uffff"+
            "\1\7\2\uffff\3\7",
            "\1\7\1\uffff\1\7\1\uffff\1\7\2\uffff\1\7\2\uffff\1\1\5\uffff"+
            "\1\7\1\uffff\1\7\7\uffff\1\1\1\uffff\1\7\14\uffff\1\7\5\uffff"+
            "\1\7\4\uffff\1\7\1\uffff\2\7\10\uffff\1\7\5\uffff\1\7\1\uffff"+
            "\1\7\4\uffff\1\7\3\uffff\2\7\4\uffff\1\7\3\uffff\2\7\1\uffff"+
            "\2\7\6\uffff\1\7\2\uffff\1\7\5\uffff\1\7\6\uffff\1\7\1\uffff"+
            "\1\7\2\uffff\3\7",
            "\1\5\22\uffff\1\13\31\uffff\1\14",
            "\1\5\22\uffff\1\13\31\uffff\1\14"
    };

    static final short[] DFA22_eot = DFA.unpackEncodedString(DFA22_eotS);
    static final short[] DFA22_eof = DFA.unpackEncodedString(DFA22_eofS);
    static final char[] DFA22_min = DFA.unpackEncodedStringToUnsignedChars(DFA22_minS);
    static final char[] DFA22_max = DFA.unpackEncodedStringToUnsignedChars(DFA22_maxS);
    static final short[] DFA22_accept = DFA.unpackEncodedString(DFA22_acceptS);
    static final short[] DFA22_special = DFA.unpackEncodedString(DFA22_specialS);
    static final short[][] DFA22_transition;

    static {
        int numStates = DFA22_transitionS.length;
        DFA22_transition = new short[numStates][];
        for (int i=0; i<numStates; i++) {
            DFA22_transition[i] = DFA.unpackEncodedString(DFA22_transitionS[i]);
        }
    }

    class DFA22 extends DFA {

        public DFA22(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 22;
            this.eot = DFA22_eot;
            this.eof = DFA22_eof;
            this.min = DFA22_min;
            this.max = DFA22_max;
            this.accept = DFA22_accept;
            this.special = DFA22_special;
            this.transition = DFA22_transition;
        }
        public String getDescription() {
            return "()* loopback of 251:20: ( COMMA ! table_ref )*";
        }
    }
    static final String DFA27_eotS =
        "\30\uffff";
    static final String DFA27_eofS =
        "\1\6\27\uffff";
    static final String DFA27_minS =
        "\2\12\1\17\3\0\1\uffff\3\0\2\17\1\uffff\1\17\4\0\2\17\4\0";
    static final String DFA27_maxS =
        "\1\u0085\2\74\3\0\1\uffff\3\0\2\74\1\uffff\1\74\4\0\2\74\4\0";
    static final String DFA27_acceptS =
        "\6\uffff\1\2\5\uffff\1\1\13\uffff";
    static final String DFA27_specialS =
        "\3\uffff\1\10\1\2\1\0\1\uffff\1\7\1\15\1\1\4\uffff\1\6\1\14\1\5"+
        "\1\13\2\uffff\1\4\1\12\1\3\1\11}>";
    static final String[] DFA27_transitionS = {
            "\1\5\1\uffff\1\6\2\uffff\1\4\10\uffff\1\2\1\uffff\1\6\11\uffff"+
            "\2\6\13\uffff\1\6\5\uffff\1\6\4\uffff\1\3\1\uffff\2\6\10\uffff"+
            "\1\1\5\uffff\1\6\1\uffff\1\6\4\uffff\1\6\3\uffff\2\6\4\uffff"+
            "\1\6\3\uffff\2\6\1\uffff\2\6\6\uffff\1\6\2\uffff\1\6\5\uffff"+
            "\1\6\6\uffff\1\6\1\uffff\1\6\2\uffff\3\6",
            "\1\11\4\uffff\1\10\10\uffff\1\2\43\uffff\1\7",
            "\1\13\54\uffff\1\12",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "\1\17\22\uffff\1\15\31\uffff\1\16",
            "\1\21\22\uffff\1\15\31\uffff\1\20",
            "",
            "\1\23\54\uffff\1\22",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "\1\25\22\uffff\1\15\31\uffff\1\24",
            "\1\27\22\uffff\1\15\31\uffff\1\26",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff"
    };

    static final short[] DFA27_eot = DFA.unpackEncodedString(DFA27_eotS);
    static final short[] DFA27_eof = DFA.unpackEncodedString(DFA27_eofS);
    static final char[] DFA27_min = DFA.unpackEncodedStringToUnsignedChars(DFA27_minS);
    static final char[] DFA27_max = DFA.unpackEncodedStringToUnsignedChars(DFA27_maxS);
    static final short[] DFA27_accept = DFA.unpackEncodedString(DFA27_acceptS);
    static final short[] DFA27_special = DFA.unpackEncodedString(DFA27_specialS);
    static final short[][] DFA27_transition;

    static {
        int numStates = DFA27_transitionS.length;
        DFA27_transition = new short[numStates][];
        for (int i=0; i<numStates; i++) {
            DFA27_transition[i] = DFA.unpackEncodedString(DFA27_transitionS[i]);
        }
    }

    class DFA27 extends DFA {

        public DFA27(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 27;
            this.eot = DFA27_eot;
            this.eof = DFA27_eof;
            this.min = DFA27_min;
            this.max = DFA27_max;
            this.accept = DFA27_accept;
            this.special = DFA27_special;
            this.transition = DFA27_transition;
        }
        public String getDescription() {
            return "265:9: ({...}? alias )?";
        }
        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
            TokenStream input = (TokenStream)_input;
        	int _s = s;
            switch ( s ) {
                    case 0 : 
                        int LA27_5 = input.LA(1);

                         
                        int index27_5 = input.index();
                        input.rewind();

                        s = -1;
                        if ( ((isTableAlias())) ) {s = 12;}

                        else if ( (true) ) {s = 6;}

                         
                        input.seek(index27_5);

                        if ( s>=0 ) return s;
                        break;

                    case 1 : 
                        int LA27_9 = input.LA(1);

                         
                        int index27_9 = input.index();
                        input.rewind();

                        s = -1;
                        if ( ((isTableAlias())) ) {s = 12;}

                        else if ( (true) ) {s = 6;}

                         
                        input.seek(index27_9);

                        if ( s>=0 ) return s;
                        break;

                    case 2 : 
                        int LA27_4 = input.LA(1);

                         
                        int index27_4 = input.index();
                        input.rewind();

                        s = -1;
                        if ( ((isTableAlias())) ) {s = 12;}

                        else if ( (true) ) {s = 6;}

                         
                        input.seek(index27_4);

                        if ( s>=0 ) return s;
                        break;

                    case 3 : 
                        int LA27_22 = input.LA(1);

                         
                        int index27_22 = input.index();
                        input.rewind();

                        s = -1;
                        if ( ((isTableAlias())) ) {s = 12;}

                        else if ( (true) ) {s = 6;}

                         
                        input.seek(index27_22);

                        if ( s>=0 ) return s;
                        break;

                    case 4 : 
                        int LA27_20 = input.LA(1);

                         
                        int index27_20 = input.index();
                        input.rewind();

                        s = -1;
                        if ( ((isTableAlias())) ) {s = 12;}

                        else if ( (true) ) {s = 6;}

                         
                        input.seek(index27_20);

                        if ( s>=0 ) return s;
                        break;

                    case 5 : 
                        int LA27_16 = input.LA(1);

                         
                        int index27_16 = input.index();
                        input.rewind();

                        s = -1;
                        if ( ((isTableAlias())) ) {s = 12;}

                        else if ( (true) ) {s = 6;}

                         
                        input.seek(index27_16);

                        if ( s>=0 ) return s;
                        break;

                    case 6 : 
                        int LA27_14 = input.LA(1);

                         
                        int index27_14 = input.index();
                        input.rewind();

                        s = -1;
                        if ( ((isTableAlias())) ) {s = 12;}

                        else if ( (true) ) {s = 6;}

                         
                        input.seek(index27_14);

                        if ( s>=0 ) return s;
                        break;

                    case 7 : 
                        int LA27_7 = input.LA(1);

                         
                        int index27_7 = input.index();
                        input.rewind();

                        s = -1;
                        if ( ((isTableAlias())) ) {s = 12;}

                        else if ( (true) ) {s = 6;}

                         
                        input.seek(index27_7);

                        if ( s>=0 ) return s;
                        break;

                    case 8 : 
                        int LA27_3 = input.LA(1);

                         
                        int index27_3 = input.index();
                        input.rewind();

                        s = -1;
                        if ( ((isTableAlias())) ) {s = 12;}

                        else if ( (true) ) {s = 6;}

                         
                        input.seek(index27_3);

                        if ( s>=0 ) return s;
                        break;

                    case 9 : 
                        int LA27_23 = input.LA(1);

                         
                        int index27_23 = input.index();
                        input.rewind();

                        s = -1;
                        if ( ((isTableAlias())) ) {s = 12;}

                        else if ( (true) ) {s = 6;}

                         
                        input.seek(index27_23);

                        if ( s>=0 ) return s;
                        break;

                    case 10 : 
                        int LA27_21 = input.LA(1);

                         
                        int index27_21 = input.index();
                        input.rewind();

                        s = -1;
                        if ( ((isTableAlias())) ) {s = 12;}

                        else if ( (true) ) {s = 6;}

                         
                        input.seek(index27_21);

                        if ( s>=0 ) return s;
                        break;

                    case 11 : 
                        int LA27_17 = input.LA(1);

                         
                        int index27_17 = input.index();
                        input.rewind();

                        s = -1;
                        if ( ((isTableAlias())) ) {s = 12;}

                        else if ( (true) ) {s = 6;}

                         
                        input.seek(index27_17);

                        if ( s>=0 ) return s;
                        break;

                    case 12 : 
                        int LA27_15 = input.LA(1);

                         
                        int index27_15 = input.index();
                        input.rewind();

                        s = -1;
                        if ( ((isTableAlias())) ) {s = 12;}

                        else if ( (true) ) {s = 6;}

                         
                        input.seek(index27_15);

                        if ( s>=0 ) return s;
                        break;

                    case 13 : 
                        int LA27_8 = input.LA(1);

                         
                        int index27_8 = input.index();
                        input.rewind();

                        s = -1;
                        if ( ((isTableAlias())) ) {s = 12;}

                        else if ( (true) ) {s = 6;}

                         
                        input.seek(index27_8);

                        if ( s>=0 ) return s;
                        break;
            }
            if (state.backtracking>0) {state.failed=true; return -1;}

            NoViableAltException nvae =
                new NoViableAltException(getDescription(), 27, _s, input);
            error(nvae);
            throw nvae;
        }

    }
    static final String DFA72_eotS =
        "\15\uffff";
    static final String DFA72_eofS =
        "\15\uffff";
    static final String DFA72_minS =
        "\1\74\2\17\2\74\1\uffff\2\17\2\uffff\3\17";
    static final String DFA72_maxS =
        "\1\74\1\115\1\74\2\156\1\uffff\2\74\2\uffff\3\74";
    static final String DFA72_acceptS =
        "\5\uffff\1\2\2\uffff\1\2\1\1\3\uffff";
    static final String DFA72_specialS =
        "\1\4\1\1\1\5\1\3\1\0\1\uffff\1\6\1\10\2\uffff\1\2\1\11\1\7}>";
    static final String[] DFA72_transitionS = {
            "\1\1",
            "\1\4\10\uffff\1\2\43\uffff\1\3\20\uffff\1\5",
            "\1\7\54\uffff\1\6",
            "\1\10\61\uffff\1\11",
            "\1\10\61\uffff\1\11",
            "",
            "\1\4\22\uffff\1\12\31\uffff\1\3",
            "\1\4\22\uffff\1\12\31\uffff\1\3",
            "",
            "",
            "\1\14\54\uffff\1\13",
            "\1\4\22\uffff\1\12\31\uffff\1\3",
            "\1\4\22\uffff\1\12\31\uffff\1\3"
    };

    static final short[] DFA72_eot = DFA.unpackEncodedString(DFA72_eotS);
    static final short[] DFA72_eof = DFA.unpackEncodedString(DFA72_eofS);
    static final char[] DFA72_min = DFA.unpackEncodedStringToUnsignedChars(DFA72_minS);
    static final char[] DFA72_max = DFA.unpackEncodedStringToUnsignedChars(DFA72_maxS);
    static final short[] DFA72_accept = DFA.unpackEncodedString(DFA72_acceptS);
    static final short[] DFA72_special = DFA.unpackEncodedString(DFA72_specialS);
    static final short[][] DFA72_transition;

    static {
        int numStates = DFA72_transitionS.length;
        DFA72_transition = new short[numStates][];
        for (int i=0; i<numStates; i++) {
            DFA72_transition[i] = DFA.unpackEncodedString(DFA72_transitionS[i]);
        }
    }

    class DFA72 extends DFA {

        public DFA72(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 72;
            this.eot = DFA72_eot;
            this.eof = DFA72_eof;
            this.min = DFA72_min;
            this.max = DFA72_max;
            this.accept = DFA72_accept;
            this.special = DFA72_special;
            this.transition = DFA72_transition;
        }
        public String getDescription() {
            return "()* loopback of 435:64: ( reference_model )*";
        }
        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
            TokenStream input = (TokenStream)_input;
        	int _s = s;
            switch ( s ) {
                    case 0 : 
                        int LA72_4 = input.LA(1);

                         
                        int index72_4 = input.index();
                        input.rewind();

                        s = -1;
                        if ( (LA72_4==REGULAR_ID) && ((input.LT(1).getText().equalsIgnoreCase("main")))) {s = 8;}

                        else if ( (LA72_4==SQL92_RESERVED_ON) && ((input.LT(1).getText().equalsIgnoreCase("reference")))) {s = 9;}

                         
                        input.seek(index72_4);

                        if ( s>=0 ) return s;
                        break;

                    case 1 : 
                        int LA72_1 = input.LA(1);

                         
                        int index72_1 = input.index();
                        input.rewind();

                        s = -1;
                        if ( (LA72_1==INTRODUCER) && (((input.LT(1).getText().equalsIgnoreCase("reference"))||(input.LT(1).getText().equalsIgnoreCase("main"))))) {s = 2;}

                        else if ( (LA72_1==REGULAR_ID) && (((input.LT(1).getText().equalsIgnoreCase("reference"))||(input.LT(1).getText().equalsIgnoreCase("main"))))) {s = 3;}

                        else if ( (LA72_1==DELIMITED_ID) && (((input.LT(1).getText().equalsIgnoreCase("reference"))||(input.LT(1).getText().equalsIgnoreCase("main"))))) {s = 4;}

                        else if ( (LA72_1==SQL92_RESERVED_BY) && (((input.LT(1).getText().equalsIgnoreCase("dimension"))||(input.LT(1).getText().equalsIgnoreCase("partition"))))) {s = 5;}

                         
                        input.seek(index72_1);

                        if ( s>=0 ) return s;
                        break;

                    case 2 : 
                        int LA72_10 = input.LA(1);

                         
                        int index72_10 = input.index();
                        input.rewind();

                        s = -1;
                        if ( (LA72_10==REGULAR_ID) && (((input.LT(1).getText().equalsIgnoreCase("reference"))||(input.LT(1).getText().equalsIgnoreCase("main"))))) {s = 11;}

                        else if ( (LA72_10==DELIMITED_ID) && (((input.LT(1).getText().equalsIgnoreCase("reference"))||(input.LT(1).getText().equalsIgnoreCase("main"))))) {s = 12;}

                         
                        input.seek(index72_10);

                        if ( s>=0 ) return s;
                        break;

                    case 3 : 
                        int LA72_3 = input.LA(1);

                         
                        int index72_3 = input.index();
                        input.rewind();

                        s = -1;
                        if ( (LA72_3==REGULAR_ID) && ((input.LT(1).getText().equalsIgnoreCase("main")))) {s = 8;}

                        else if ( (LA72_3==SQL92_RESERVED_ON) && ((input.LT(1).getText().equalsIgnoreCase("reference")))) {s = 9;}

                         
                        input.seek(index72_3);

                        if ( s>=0 ) return s;
                        break;

                    case 4 : 
                        int LA72_0 = input.LA(1);

                         
                        int index72_0 = input.index();
                        input.rewind();

                        s = -1;
                        if ( (LA72_0==REGULAR_ID) && (((input.LT(1).getText().equalsIgnoreCase("reference"))||(input.LT(1).getText().equalsIgnoreCase("dimension"))||(input.LT(1).getText().equalsIgnoreCase("main"))||(input.LT(1).getText().equalsIgnoreCase("partition"))))) {s = 1;}

                         
                        input.seek(index72_0);

                        if ( s>=0 ) return s;
                        break;

                    case 5 : 
                        int LA72_2 = input.LA(1);

                         
                        int index72_2 = input.index();
                        input.rewind();

                        s = -1;
                        if ( (LA72_2==REGULAR_ID) && (((input.LT(1).getText().equalsIgnoreCase("reference"))||(input.LT(1).getText().equalsIgnoreCase("main"))))) {s = 6;}

                        else if ( (LA72_2==DELIMITED_ID) && (((input.LT(1).getText().equalsIgnoreCase("reference"))||(input.LT(1).getText().equalsIgnoreCase("main"))))) {s = 7;}

                         
                        input.seek(index72_2);

                        if ( s>=0 ) return s;
                        break;

                    case 6 : 
                        int LA72_6 = input.LA(1);

                         
                        int index72_6 = input.index();
                        input.rewind();

                        s = -1;
                        if ( (LA72_6==PERIOD) && (((input.LT(1).getText().equalsIgnoreCase("reference"))||(input.LT(1).getText().equalsIgnoreCase("main"))))) {s = 10;}

                        else if ( (LA72_6==REGULAR_ID) && (((input.LT(1).getText().equalsIgnoreCase("reference"))||(input.LT(1).getText().equalsIgnoreCase("main"))))) {s = 3;}

                        else if ( (LA72_6==DELIMITED_ID) && (((input.LT(1).getText().equalsIgnoreCase("reference"))||(input.LT(1).getText().equalsIgnoreCase("main"))))) {s = 4;}

                         
                        input.seek(index72_6);

                        if ( s>=0 ) return s;
                        break;

                    case 7 : 
                        int LA72_12 = input.LA(1);

                         
                        int index72_12 = input.index();
                        input.rewind();

                        s = -1;
                        if ( (LA72_12==REGULAR_ID) && (((input.LT(1).getText().equalsIgnoreCase("reference"))||(input.LT(1).getText().equalsIgnoreCase("main"))))) {s = 3;}

                        else if ( (LA72_12==DELIMITED_ID) && (((input.LT(1).getText().equalsIgnoreCase("reference"))||(input.LT(1).getText().equalsIgnoreCase("main"))))) {s = 4;}

                        else if ( (LA72_12==PERIOD) && (((input.LT(1).getText().equalsIgnoreCase("reference"))||(input.LT(1).getText().equalsIgnoreCase("main"))))) {s = 10;}

                         
                        input.seek(index72_12);

                        if ( s>=0 ) return s;
                        break;

                    case 8 : 
                        int LA72_7 = input.LA(1);

                         
                        int index72_7 = input.index();
                        input.rewind();

                        s = -1;
                        if ( (LA72_7==PERIOD) && (((input.LT(1).getText().equalsIgnoreCase("reference"))||(input.LT(1).getText().equalsIgnoreCase("main"))))) {s = 10;}

                        else if ( (LA72_7==REGULAR_ID) && (((input.LT(1).getText().equalsIgnoreCase("reference"))||(input.LT(1).getText().equalsIgnoreCase("main"))))) {s = 3;}

                        else if ( (LA72_7==DELIMITED_ID) && (((input.LT(1).getText().equalsIgnoreCase("reference"))||(input.LT(1).getText().equalsIgnoreCase("main"))))) {s = 4;}

                         
                        input.seek(index72_7);

                        if ( s>=0 ) return s;
                        break;

                    case 9 : 
                        int LA72_11 = input.LA(1);

                         
                        int index72_11 = input.index();
                        input.rewind();

                        s = -1;
                        if ( (LA72_11==REGULAR_ID) && (((input.LT(1).getText().equalsIgnoreCase("reference"))||(input.LT(1).getText().equalsIgnoreCase("main"))))) {s = 3;}

                        else if ( (LA72_11==DELIMITED_ID) && (((input.LT(1).getText().equalsIgnoreCase("reference"))||(input.LT(1).getText().equalsIgnoreCase("main"))))) {s = 4;}

                        else if ( (LA72_11==PERIOD) && (((input.LT(1).getText().equalsIgnoreCase("reference"))||(input.LT(1).getText().equalsIgnoreCase("main"))))) {s = 10;}

                         
                        input.seek(index72_11);

                        if ( s>=0 ) return s;
                        break;
            }
            if (state.backtracking>0) {state.failed=true; return -1;}

            NoViableAltException nvae =
                new NoViableAltException(getDescription(), 72, _s, input);
            error(nvae);
            throw nvae;
        }

    }
    static final String DFA130_eotS =
        "\21\uffff";
    static final String DFA130_eofS =
        "\1\2\20\uffff";
    static final String DFA130_minS =
        "\1\17\1\5\1\uffff\2\5\1\17\1\10\2\17\1\22\2\17\1\uffff\1\17\1\22"+
        "\2\17";
    static final String DFA130_maxS =
        "\1\u0085\1\u0087\1\uffff\2\u0087\1\172\1\110\1\74\1\137\3\74\1\uffff"+
        "\4\74";
    static final String DFA130_acceptS =
        "\2\uffff\1\2\11\uffff\1\1\4\uffff";
    static final String DFA130_specialS =
        "\21\uffff}>";
    static final String[] DFA130_transitionS = {
            "\1\2\12\uffff\1\2\41\uffff\1\2\2\uffff\1\2\16\uffff\1\2\6\uffff"+
            "\1\2\3\uffff\2\2\13\uffff\1\2\20\uffff\1\2\10\uffff\1\2\2\uffff"+
            "\1\1\1\uffff\1\2",
            "\1\2\4\uffff\2\2\3\uffff\1\2\3\uffff\1\2\4\uffff\1\2\1\uffff"+
            "\1\2\2\uffff\1\2\34\uffff\1\2\1\uffff\1\3\7\uffff\1\2\2\uffff"+
            "\1\2\6\uffff\1\2\5\uffff\1\2\2\uffff\1\2\4\uffff\2\2\15\uffff"+
            "\2\2\6\uffff\1\2\11\uffff\1\2\11\uffff\1\2",
            "",
            "\1\2\1\uffff\1\2\2\uffff\2\2\2\uffff\2\2\2\uffff\2\2\1\uffff"+
            "\2\2\1\uffff\6\2\2\uffff\1\2\1\uffff\1\2\27\uffff\1\2\1\uffff"+
            "\1\2\5\uffff\1\2\1\uffff\1\2\1\uffff\2\2\4\uffff\1\2\1\uffff"+
            "\1\2\5\uffff\1\2\2\uffff\1\2\4\uffff\2\2\7\uffff\1\2\3\uffff"+
            "\4\2\3\uffff\1\2\2\uffff\1\2\7\uffff\1\4\1\uffff\1\2\11\uffff"+
            "\1\2",
            "\1\2\4\uffff\2\2\3\uffff\1\2\3\uffff\1\2\4\uffff\1\2\1\uffff"+
            "\1\2\2\uffff\1\2\34\uffff\1\2\1\uffff\1\2\7\uffff\1\2\2\uffff"+
            "\1\2\6\uffff\1\2\5\uffff\2\2\1\uffff\1\2\4\uffff\2\2\10\uffff"+
            "\1\2\4\uffff\2\2\6\uffff\1\2\3\uffff\1\2\5\uffff\1\2\2\uffff"+
            "\1\5\4\uffff\1\2\1\uffff\1\2",
            "\1\2\10\uffff\1\2\1\uffff\1\2\41\uffff\1\6\75\uffff\1\2",
            "\1\2\1\uffff\1\2\4\uffff\1\11\10\uffff\1\7\1\uffff\1\2\7\uffff"+
            "\1\2\31\uffff\1\10\13\uffff\1\2",
            "\1\13\54\uffff\1\12",
            "\1\2\2\uffff\1\14\5\uffff\1\2\1\uffff\1\2\7\uffff\1\14\31\uffff"+
            "\1\2\42\uffff\1\2",
            "\1\14\17\uffff\1\14\31\uffff\1\2",
            "\1\11\22\uffff\1\15\31\uffff\1\16",
            "\1\11\22\uffff\1\15\31\uffff\1\16",
            "",
            "\1\20\54\uffff\1\17",
            "\1\14\17\uffff\1\14\31\uffff\1\2",
            "\1\11\22\uffff\1\15\31\uffff\1\16",
            "\1\11\22\uffff\1\15\31\uffff\1\16"
    };

    static final short[] DFA130_eot = DFA.unpackEncodedString(DFA130_eotS);
    static final short[] DFA130_eof = DFA.unpackEncodedString(DFA130_eofS);
    static final char[] DFA130_min = DFA.unpackEncodedStringToUnsignedChars(DFA130_minS);
    static final char[] DFA130_max = DFA.unpackEncodedStringToUnsignedChars(DFA130_maxS);
    static final short[] DFA130_accept = DFA.unpackEncodedString(DFA130_acceptS);
    static final short[] DFA130_special = DFA.unpackEncodedString(DFA130_specialS);
    static final short[][] DFA130_transition;

    static {
        int numStates = DFA130_transitionS.length;
        DFA130_transition = new short[numStates][];
        for (int i=0; i<numStates; i++) {
            DFA130_transition[i] = DFA.unpackEncodedString(DFA130_transitionS[i]);
        }
    }

    class DFA130 extends DFA {

        public DFA130(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 130;
            this.eot = DFA130_eot;
            this.eof = DFA130_eof;
            this.min = DFA130_min;
            this.max = DFA130_max;
            this.accept = DFA130_accept;
            this.special = DFA130_special;
            this.transition = DFA130_transition;
        }
        public String getDescription() {
            return "629:9: ( merge_update_clause )?";
        }
    }
    static final String DFA151_eotS =
        "\14\uffff";
    static final String DFA151_eofS =
        "\1\2\13\uffff";
    static final String DFA151_minS =
        "\1\5\1\17\1\uffff\1\17\2\uffff\3\17\1\uffff\2\17";
    static final String DFA151_maxS =
        "\1\u0087\1\172\1\uffff\1\74\2\uffff\3\74\1\uffff\2\74";
    static final String DFA151_acceptS =
        "\2\uffff\1\2\1\uffff\2\1\3\uffff\1\1\2\uffff";
    static final String DFA151_specialS =
        "\14\uffff}>";
    static final String[] DFA151_transitionS = {
            "\1\2\4\uffff\2\2\3\uffff\1\2\3\uffff\1\2\4\uffff\1\2\1\uffff"+
            "\1\2\2\uffff\1\2\34\uffff\1\2\1\uffff\1\2\2\uffff\1\2\4\uffff"+
            "\1\2\2\uffff\1\2\6\uffff\1\2\5\uffff\2\2\1\uffff\1\2\1\uffff"+
            "\2\2\1\uffff\2\2\10\uffff\1\2\1\uffff\1\1\2\uffff\2\2\6\uffff"+
            "\1\2\3\uffff\1\2\5\uffff\1\2\2\uffff\1\2\2\uffff\1\2\1\uffff"+
            "\1\2\1\uffff\1\2",
            "\1\5\10\uffff\1\3\1\uffff\1\2\41\uffff\1\4\75\uffff\1\2",
            "",
            "\1\7\54\uffff\1\6",
            "",
            "",
            "\1\5\22\uffff\1\10\31\uffff\1\11",
            "\1\5\22\uffff\1\10\31\uffff\1\11",
            "\1\13\54\uffff\1\12",
            "",
            "\1\5\22\uffff\1\10\31\uffff\1\11",
            "\1\5\22\uffff\1\10\31\uffff\1\11"
    };

    static final short[] DFA151_eot = DFA.unpackEncodedString(DFA151_eotS);
    static final short[] DFA151_eof = DFA.unpackEncodedString(DFA151_eofS);
    static final char[] DFA151_min = DFA.unpackEncodedStringToUnsignedChars(DFA151_minS);
    static final char[] DFA151_max = DFA.unpackEncodedStringToUnsignedChars(DFA151_maxS);
    static final short[] DFA151_accept = DFA.unpackEncodedString(DFA151_acceptS);
    static final short[] DFA151_special = DFA.unpackEncodedString(DFA151_specialS);
    static final short[][] DFA151_transition;

    static {
        int numStates = DFA151_transitionS.length;
        DFA151_transition = new short[numStates][];
        for (int i=0; i<numStates; i++) {
            DFA151_transition[i] = DFA.unpackEncodedString(DFA151_transitionS[i]);
        }
    }

    class DFA151 extends DFA {

        public DFA151(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 151;
            this.eot = DFA151_eot;
            this.eof = DFA151_eof;
            this.min = DFA151_min;
            this.max = DFA151_max;
            this.accept = DFA151_accept;
            this.special = DFA151_special;
            this.transition = DFA151_transition;
        }
        public String getDescription() {
            return "711:9: ( error_logging_into_part )?";
        }
    }
    static final String DFA193_eotS =
        "\75\uffff";
    static final String DFA193_eofS =
        "\1\2\74\uffff";
    static final String DFA193_minS =
        "\1\7\74\uffff";
    static final String DFA193_maxS =
        "\1\u0085\74\uffff";
    static final String DFA193_acceptS =
        "\1\uffff\1\1\1\2\72\uffff";
    static final String DFA193_specialS =
        "\75\uffff}>";
    static final String[] DFA193_transitionS = {
            "\1\2\2\uffff\1\2\1\uffff\1\2\1\uffff\2\2\2\uffff\1\2\2\uffff"+
            "\2\2\1\uffff\2\2\1\1\3\2\2\uffff\1\2\3\uffff\2\2\2\uffff\1\2"+
            "\10\uffff\1\2\5\uffff\1\2\2\uffff\1\2\1\uffff\4\2\2\uffff\1"+
            "\2\3\uffff\1\2\1\uffff\2\2\2\uffff\1\2\1\uffff\1\2\1\uffff\1"+
            "\2\3\uffff\3\2\2\uffff\2\2\4\uffff\2\2\2\uffff\11\2\2\uffff"+
            "\1\2\1\uffff\2\2\5\uffff\1\2\3\uffff\2\2\1\uffff\1\2\1\uffff"+
            "\1\2\2\uffff\3\2",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            ""
    };

    static final short[] DFA193_eot = DFA.unpackEncodedString(DFA193_eotS);
    static final short[] DFA193_eof = DFA.unpackEncodedString(DFA193_eofS);
    static final char[] DFA193_min = DFA.unpackEncodedStringToUnsignedChars(DFA193_minS);
    static final char[] DFA193_max = DFA.unpackEncodedStringToUnsignedChars(DFA193_maxS);
    static final short[] DFA193_accept = DFA.unpackEncodedString(DFA193_acceptS);
    static final short[] DFA193_special = DFA.unpackEncodedString(DFA193_specialS);
    static final short[][] DFA193_transition;

    static {
        int numStates = DFA193_transitionS.length;
        DFA193_transition = new short[numStates][];
        for (int i=0; i<numStates; i++) {
            DFA193_transition[i] = DFA.unpackEncodedString(DFA193_transitionS[i]);
        }
    }

    class DFA193 extends DFA {

        public DFA193(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 193;
            this.eot = DFA193_eot;
            this.eof = DFA193_eof;
            this.min = DFA193_min;
            this.max = DFA193_max;
            this.accept = DFA193_accept;
            this.special = DFA193_special;
            this.transition = DFA193_transition;
        }
        public String getDescription() {
            return "908:91: ( LEFT_PAREN cn2= concatenation_wrapper RIGHT_PAREN )?";
        }
    }
    static final String DFA232_eotS =
        "\75\uffff";
    static final String DFA232_eofS =
        "\1\2\74\uffff";
    static final String DFA232_minS =
        "\1\7\74\uffff";
    static final String DFA232_maxS =
        "\1\u0085\74\uffff";
    static final String DFA232_acceptS =
        "\1\uffff\1\1\1\2\72\uffff";
    static final String DFA232_specialS =
        "\75\uffff}>";
    static final String[] DFA232_transitionS = {
            "\1\2\2\uffff\1\2\1\uffff\1\2\1\uffff\2\2\2\uffff\1\2\2\uffff"+
            "\2\2\1\uffff\6\2\2\uffff\1\2\3\uffff\1\2\1\1\2\uffff\1\2\10"+
            "\uffff\1\2\5\uffff\1\2\2\uffff\1\2\1\uffff\4\2\2\uffff\1\2\3"+
            "\uffff\1\2\1\uffff\2\2\2\uffff\1\2\1\uffff\1\2\1\uffff\1\2\3"+
            "\uffff\3\2\2\uffff\2\2\4\uffff\2\2\2\uffff\11\2\2\uffff\1\2"+
            "\1\uffff\2\2\5\uffff\1\2\3\uffff\2\2\1\uffff\1\2\1\uffff\1\2"+
            "\2\uffff\3\2",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            ""
    };

    static final short[] DFA232_eot = DFA.unpackEncodedString(DFA232_eotS);
    static final short[] DFA232_eof = DFA.unpackEncodedString(DFA232_eofS);
    static final char[] DFA232_min = DFA.unpackEncodedStringToUnsignedChars(DFA232_minS);
    static final char[] DFA232_max = DFA.unpackEncodedStringToUnsignedChars(DFA232_maxS);
    static final short[] DFA232_accept = DFA.unpackEncodedString(DFA232_acceptS);
    static final short[] DFA232_special = DFA.unpackEncodedString(DFA232_specialS);
    static final short[][] DFA232_transition;

    static {
        int numStates = DFA232_transitionS.length;
        DFA232_transition = new short[numStates][];
        for (int i=0; i<numStates; i++) {
            DFA232_transition[i] = DFA.unpackEncodedString(DFA232_transitionS[i]);
        }
    }

    class DFA232 extends DFA {

        public DFA232(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 232;
            this.eot = DFA232_eot;
            this.eof = DFA232_eof;
            this.min = DFA232_min;
            this.max = DFA232_max;
            this.accept = DFA232_accept;
            this.special = DFA232_special;
            this.transition = DFA232_transition;
        }
        public String getDescription() {
            return "1044:62: ( using_clause )?";
        }
    }
    static final String DFA263_eotS =
        "\16\uffff";
    static final String DFA263_eofS =
        "\16\uffff";
    static final String DFA263_minS =
        "\1\74\1\5\1\17\2\0\1\uffff\2\13\1\uffff\1\17\2\0\2\13";
    static final String DFA263_maxS =
        "\1\74\1\u0087\1\74\2\0\1\uffff\2\74\1\uffff\1\74\2\0\2\74";
    static final String DFA263_acceptS =
        "\5\uffff\1\2\2\uffff\1\1\5\uffff";
    static final String DFA263_specialS =
        "\1\7\1\0\1\3\1\12\1\1\1\uffff\1\10\1\11\1\uffff\1\5\1\2\1\4\1\13"+
        "\1\6}>";
    static final String[] DFA263_transitionS = {
            "\1\1",
            "\1\5\4\uffff\2\5\3\uffff\1\4\3\uffff\1\5\4\uffff\1\2\1\uffff"+
            "\1\5\2\uffff\1\5\34\uffff\1\5\1\uffff\1\3\7\uffff\1\5\2\uffff"+
            "\1\5\6\uffff\1\5\5\uffff\1\5\2\uffff\1\5\4\uffff\2\5\16\uffff"+
            "\1\5\6\uffff\1\5\11\uffff\1\5\11\uffff\1\5",
            "\1\7\54\uffff\1\6",
            "\1\uffff",
            "\1\uffff",
            "",
            "\1\5\3\uffff\1\13\22\uffff\1\11\31\uffff\1\12",
            "\1\5\3\uffff\1\13\22\uffff\1\11\31\uffff\1\12",
            "",
            "\1\15\54\uffff\1\14",
            "\1\uffff",
            "\1\uffff",
            "\1\5\3\uffff\1\13\22\uffff\1\11\31\uffff\1\12",
            "\1\5\3\uffff\1\13\22\uffff\1\11\31\uffff\1\12"
    };

    static final short[] DFA263_eot = DFA.unpackEncodedString(DFA263_eotS);
    static final short[] DFA263_eof = DFA.unpackEncodedString(DFA263_eofS);
    static final char[] DFA263_min = DFA.unpackEncodedStringToUnsignedChars(DFA263_minS);
    static final char[] DFA263_max = DFA.unpackEncodedStringToUnsignedChars(DFA263_maxS);
    static final short[] DFA263_accept = DFA.unpackEncodedString(DFA263_acceptS);
    static final short[] DFA263_special = DFA.unpackEncodedString(DFA263_specialS);
    static final short[][] DFA263_transition;

    static {
        int numStates = DFA263_transitionS.length;
        DFA263_transition = new short[numStates][];
        for (int i=0; i<numStates; i++) {
            DFA263_transition[i] = DFA.unpackEncodedString(DFA263_transitionS[i]);
        }
    }

    class DFA263 extends DFA {

        public DFA263(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 263;
            this.eot = DFA263_eot;
            this.eof = DFA263_eof;
            this.min = DFA263_min;
            this.max = DFA263_max;
            this.accept = DFA263_accept;
            this.special = DFA263_special;
            this.transition = DFA263_transition;
        }
        public String getDescription() {
            return "1118:17: ( name_key id | evalname_key concatenation_wrapper )";
        }
        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
            TokenStream input = (TokenStream)_input;
        	int _s = s;
            switch ( s ) {
                    case 0 : 
                        int LA263_1 = input.LA(1);

                         
                        int index263_1 = input.index();
                        input.rewind();

                        s = -1;
                        if ( (LA263_1==INTRODUCER) && (((input.LT(1).getText().equalsIgnoreCase("evalname"))||(input.LT(1).getText().equalsIgnoreCase("name"))))) {s = 2;}

                        else if ( (LA263_1==REGULAR_ID) && (((input.LT(1).getText().equalsIgnoreCase("evalname"))||(input.LT(1).getText().equalsIgnoreCase("name"))))) {s = 3;}

                        else if ( (LA263_1==DELIMITED_ID) && (((input.LT(1).getText().equalsIgnoreCase("evalname"))||(input.LT(1).getText().equalsIgnoreCase("name"))))) {s = 4;}

                        else if ( (LA263_1==APPROXIMATE_NUM_LIT||(LA263_1 >= CHAR_STRING && LA263_1 <= COLON)||LA263_1==EXACT_NUM_LIT||LA263_1==LEFT_PAREN||LA263_1==MINUS_SIGN||LA263_1==PLUS_SIGN||LA263_1==SQL92_RESERVED_ALL||LA263_1==SQL92_RESERVED_ANY||LA263_1==SQL92_RESERVED_CASE||LA263_1==SQL92_RESERVED_DEFAULT||LA263_1==SQL92_RESERVED_DISTINCT||(LA263_1 >= SQL92_RESERVED_EXISTS && LA263_1 <= SQL92_RESERVED_FALSE)||LA263_1==SQL92_RESERVED_NULL||LA263_1==SQL92_RESERVED_PRIOR||LA263_1==SQL92_RESERVED_TRUE||LA263_1==UNSIGNED_INTEGER) && ((input.LT(1).getText().equalsIgnoreCase("evalname")))) {s = 5;}

                         
                        input.seek(index263_1);

                        if ( s>=0 ) return s;
                        break;

                    case 1 : 
                        int LA263_4 = input.LA(1);

                         
                        int index263_4 = input.index();
                        input.rewind();

                        s = -1;
                        if ( ((input.LT(1).getText().equalsIgnoreCase("name"))) ) {s = 8;}

                        else if ( ((input.LT(1).getText().equalsIgnoreCase("evalname"))) ) {s = 5;}

                         
                        input.seek(index263_4);

                        if ( s>=0 ) return s;
                        break;

                    case 2 : 
                        int LA263_10 = input.LA(1);

                         
                        int index263_10 = input.index();
                        input.rewind();

                        s = -1;
                        if ( ((input.LT(1).getText().equalsIgnoreCase("name"))) ) {s = 8;}

                        else if ( ((input.LT(1).getText().equalsIgnoreCase("evalname"))) ) {s = 5;}

                         
                        input.seek(index263_10);

                        if ( s>=0 ) return s;
                        break;

                    case 3 : 
                        int LA263_2 = input.LA(1);

                         
                        int index263_2 = input.index();
                        input.rewind();

                        s = -1;
                        if ( (LA263_2==REGULAR_ID) && (((input.LT(1).getText().equalsIgnoreCase("evalname"))||(input.LT(1).getText().equalsIgnoreCase("name"))))) {s = 6;}

                        else if ( (LA263_2==DELIMITED_ID) && (((input.LT(1).getText().equalsIgnoreCase("evalname"))||(input.LT(1).getText().equalsIgnoreCase("name"))))) {s = 7;}

                         
                        input.seek(index263_2);

                        if ( s>=0 ) return s;
                        break;

                    case 4 : 
                        int LA263_11 = input.LA(1);

                         
                        int index263_11 = input.index();
                        input.rewind();

                        s = -1;
                        if ( ((input.LT(1).getText().equalsIgnoreCase("name"))) ) {s = 8;}

                        else if ( ((input.LT(1).getText().equalsIgnoreCase("evalname"))) ) {s = 5;}

                         
                        input.seek(index263_11);

                        if ( s>=0 ) return s;
                        break;

                    case 5 : 
                        int LA263_9 = input.LA(1);

                         
                        int index263_9 = input.index();
                        input.rewind();

                        s = -1;
                        if ( (LA263_9==REGULAR_ID) && (((input.LT(1).getText().equalsIgnoreCase("evalname"))||(input.LT(1).getText().equalsIgnoreCase("name"))))) {s = 12;}

                        else if ( (LA263_9==DELIMITED_ID) && (((input.LT(1).getText().equalsIgnoreCase("evalname"))||(input.LT(1).getText().equalsIgnoreCase("name"))))) {s = 13;}

                         
                        input.seek(index263_9);

                        if ( s>=0 ) return s;
                        break;

                    case 6 : 
                        int LA263_13 = input.LA(1);

                         
                        int index263_13 = input.index();
                        input.rewind();

                        s = -1;
                        if ( (LA263_13==REGULAR_ID) && (((input.LT(1).getText().equalsIgnoreCase("evalname"))||(input.LT(1).getText().equalsIgnoreCase("name"))))) {s = 10;}

                        else if ( (LA263_13==DELIMITED_ID) && (((input.LT(1).getText().equalsIgnoreCase("evalname"))||(input.LT(1).getText().equalsIgnoreCase("name"))))) {s = 11;}

                        else if ( (LA263_13==PERIOD) && (((input.LT(1).getText().equalsIgnoreCase("evalname"))||(input.LT(1).getText().equalsIgnoreCase("name"))))) {s = 9;}

                        else if ( (LA263_13==COLON) && ((input.LT(1).getText().equalsIgnoreCase("evalname")))) {s = 5;}

                         
                        input.seek(index263_13);

                        if ( s>=0 ) return s;
                        break;

                    case 7 : 
                        int LA263_0 = input.LA(1);

                         
                        int index263_0 = input.index();
                        input.rewind();

                        s = -1;
                        if ( (LA263_0==REGULAR_ID) && (((input.LT(1).getText().equalsIgnoreCase("evalname"))||(input.LT(1).getText().equalsIgnoreCase("name"))))) {s = 1;}

                         
                        input.seek(index263_0);

                        if ( s>=0 ) return s;
                        break;

                    case 8 : 
                        int LA263_6 = input.LA(1);

                         
                        int index263_6 = input.index();
                        input.rewind();

                        s = -1;
                        if ( (LA263_6==PERIOD) && (((input.LT(1).getText().equalsIgnoreCase("evalname"))||(input.LT(1).getText().equalsIgnoreCase("name"))))) {s = 9;}

                        else if ( (LA263_6==REGULAR_ID) && (((input.LT(1).getText().equalsIgnoreCase("evalname"))||(input.LT(1).getText().equalsIgnoreCase("name"))))) {s = 10;}

                        else if ( (LA263_6==DELIMITED_ID) && (((input.LT(1).getText().equalsIgnoreCase("evalname"))||(input.LT(1).getText().equalsIgnoreCase("name"))))) {s = 11;}

                        else if ( (LA263_6==COLON) && ((input.LT(1).getText().equalsIgnoreCase("evalname")))) {s = 5;}

                         
                        input.seek(index263_6);

                        if ( s>=0 ) return s;
                        break;

                    case 9 : 
                        int LA263_7 = input.LA(1);

                         
                        int index263_7 = input.index();
                        input.rewind();

                        s = -1;
                        if ( (LA263_7==PERIOD) && (((input.LT(1).getText().equalsIgnoreCase("evalname"))||(input.LT(1).getText().equalsIgnoreCase("name"))))) {s = 9;}

                        else if ( (LA263_7==REGULAR_ID) && (((input.LT(1).getText().equalsIgnoreCase("evalname"))||(input.LT(1).getText().equalsIgnoreCase("name"))))) {s = 10;}

                        else if ( (LA263_7==DELIMITED_ID) && (((input.LT(1).getText().equalsIgnoreCase("evalname"))||(input.LT(1).getText().equalsIgnoreCase("name"))))) {s = 11;}

                        else if ( (LA263_7==COLON) && ((input.LT(1).getText().equalsIgnoreCase("evalname")))) {s = 5;}

                         
                        input.seek(index263_7);

                        if ( s>=0 ) return s;
                        break;

                    case 10 : 
                        int LA263_3 = input.LA(1);

                         
                        int index263_3 = input.index();
                        input.rewind();

                        s = -1;
                        if ( ((input.LT(1).getText().equalsIgnoreCase("name"))) ) {s = 8;}

                        else if ( ((input.LT(1).getText().equalsIgnoreCase("evalname"))) ) {s = 5;}

                         
                        input.seek(index263_3);

                        if ( s>=0 ) return s;
                        break;

                    case 11 : 
                        int LA263_12 = input.LA(1);

                         
                        int index263_12 = input.index();
                        input.rewind();

                        s = -1;
                        if ( (LA263_12==REGULAR_ID) && (((input.LT(1).getText().equalsIgnoreCase("evalname"))||(input.LT(1).getText().equalsIgnoreCase("name"))))) {s = 10;}

                        else if ( (LA263_12==DELIMITED_ID) && (((input.LT(1).getText().equalsIgnoreCase("evalname"))||(input.LT(1).getText().equalsIgnoreCase("name"))))) {s = 11;}

                        else if ( (LA263_12==PERIOD) && (((input.LT(1).getText().equalsIgnoreCase("evalname"))||(input.LT(1).getText().equalsIgnoreCase("name"))))) {s = 9;}

                        else if ( (LA263_12==COLON) && ((input.LT(1).getText().equalsIgnoreCase("evalname")))) {s = 5;}

                         
                        input.seek(index263_12);

                        if ( s>=0 ) return s;
                        break;
            }
            if (state.backtracking>0) {state.failed=true; return -1;}

            NoViableAltException nvae =
                new NoViableAltException(getDescription(), 263, _s, input);
            error(nvae);
            throw nvae;
        }

    }
 

    public static final BitSet FOLLOW_seq_of_statements_in_compilation_unit585 = new BitSet(new long[]{0x1000000004008000L,0x0080004000204000L,0x0000000000000021L});
    public static final BitSet FOLLOW_EOF_in_compilation_unit588 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_select_statement_in_seq_of_statements609 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_update_statement_in_seq_of_statements620 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_delete_statement_in_seq_of_statements631 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_insert_statement_in_seq_of_statements642 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_merge_statement_in_seq_of_statements653 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_case_statement_in_seq_of_statements664 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_subquery_factoring_clause_in_select_statement685 = new BitSet(new long[]{0x0000000004000000L,0x0080000000000000L});
    public static final BitSet FOLLOW_subquery_in_select_statement696 = new BitSet(new long[]{0x0000000000000002L,0x0002000080000000L});
    public static final BitSet FOLLOW_for_update_clause_in_select_statement707 = new BitSet(new long[]{0x0000000000000002L,0x0002000080000000L});
    public static final BitSet FOLLOW_order_by_clause_in_select_statement719 = new BitSet(new long[]{0x0000000000000002L,0x0002000080000000L});
    public static final BitSet FOLLOW_with_key_in_subquery_factoring_clause769 = new BitSet(new long[]{0x1000000001008000L});
    public static final BitSet FOLLOW_factoring_element_in_subquery_factoring_clause772 = new BitSet(new long[]{0x0000000000001002L});
    public static final BitSet FOLLOW_COMMA_in_subquery_factoring_clause775 = new BitSet(new long[]{0x1000000001008000L});
    public static final BitSet FOLLOW_factoring_element_in_subquery_factoring_clause778 = new BitSet(new long[]{0x0000000000001002L});
    public static final BitSet FOLLOW_query_name_in_factoring_element800 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000100L});
    public static final BitSet FOLLOW_as_key_in_factoring_element802 = new BitSet(new long[]{0x0000000004000000L});
    public static final BitSet FOLLOW_LEFT_PAREN_in_factoring_element804 = new BitSet(new long[]{0x0000000004000000L,0x0080000000000000L});
    public static final BitSet FOLLOW_subquery_in_factoring_element806 = new BitSet(new long[]{0x4000000000000000L});
    public static final BitSet FOLLOW_RIGHT_PAREN_in_factoring_element808 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_subquery_basic_elements_in_subquery846 = new BitSet(new long[]{0x0002000000000002L,0x4000008000000000L});
    public static final BitSet FOLLOW_subquery_operation_part_in_subquery848 = new BitSet(new long[]{0x0002000000000002L,0x4000008000000000L});
    public static final BitSet FOLLOW_union_key_in_subquery_operation_part889 = new BitSet(new long[]{0x0000000004000000L,0x0080000000000010L});
    public static final BitSet FOLLOW_all_key_in_subquery_operation_part892 = new BitSet(new long[]{0x0000000004000000L,0x0080000000000000L});
    public static final BitSet FOLLOW_intersect_key_in_subquery_operation_part895 = new BitSet(new long[]{0x0000000004000000L,0x0080000000000000L});
    public static final BitSet FOLLOW_minus_key_in_subquery_operation_part898 = new BitSet(new long[]{0x0000000004000000L,0x0080000000000000L});
    public static final BitSet FOLLOW_subquery_basic_elements_in_subquery_operation_part902 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_query_block_in_subquery_basic_elements922 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_LEFT_PAREN_in_subquery_basic_elements933 = new BitSet(new long[]{0x0000000004000000L,0x0080000000000000L});
    public static final BitSet FOLLOW_subquery_in_subquery_basic_elements936 = new BitSet(new long[]{0x4000000000000000L});
    public static final BitSet FOLLOW_RIGHT_PAREN_in_subquery_basic_elements938 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_select_key_in_query_block967 = new BitSet(new long[]{0x1400000025088CA0L,0xA008180030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_distinct_key_in_query_block988 = new BitSet(new long[]{0x1400000025088CA0L,0x2008180030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_unique_key_in_query_block990 = new BitSet(new long[]{0x1400000025088CA0L,0x2008180030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_all_key_in_query_block992 = new BitSet(new long[]{0x1400000025088CA0L,0x2008180030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_ASTERISK_in_query_block1006 = new BitSet(new long[]{0x1000000000000000L,0x0000010100000000L});
    public static final BitSet FOLLOW_selected_element_in_query_block1011 = new BitSet(new long[]{0x1000000000001000L,0x0000010100000000L});
    public static final BitSet FOLLOW_COMMA_in_query_block1014 = new BitSet(new long[]{0x1400000025088C20L,0x2008180030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_selected_element_in_query_block1016 = new BitSet(new long[]{0x1000000000001000L,0x0000010100000000L});
    public static final BitSet FOLLOW_into_clause_in_query_block1029 = new BitSet(new long[]{0x0000000000000000L,0x0000000100000000L});
    public static final BitSet FOLLOW_from_clause_in_query_block1040 = new BitSet(new long[]{0x0080001000000002L,0x0000001800010000L,0x0000000000000010L});
    public static final BitSet FOLLOW_where_clause_in_query_block1051 = new BitSet(new long[]{0x0080001000000002L,0x0000001800010000L});
    public static final BitSet FOLLOW_hierarchical_query_clause_in_query_block1063 = new BitSet(new long[]{0x0000001000000002L,0x0000001800000000L});
    public static final BitSet FOLLOW_group_by_clause_in_query_block1075 = new BitSet(new long[]{0x0000001000000002L,0x0000001000000000L});
    public static final BitSet FOLLOW_having_clause_in_query_block1086 = new BitSet(new long[]{0x0000001000000002L});
    public static final BitSet FOLLOW_model_clause_in_query_block1098 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_select_list_elements_in_selected_element1250 = new BitSet(new long[]{0x1000000001008402L,0x0000000000000100L});
    public static final BitSet FOLLOW_alias_in_selected_element1252 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_from_key_in_from_clause1292 = new BitSet(new long[]{0x1000000005008000L,0x0400000000000000L});
    public static final BitSet FOLLOW_table_ref_list_in_from_clause1295 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_tableview_name_in_select_list_elements1324 = new BitSet(new long[]{0x0000000400000000L});
    public static final BitSet FOLLOW_PERIOD_in_select_list_elements1326 = new BitSet(new long[]{0x0000000000000080L});
    public static final BitSet FOLLOW_ASTERISK_in_select_list_elements1328 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_expression_in_select_list_elements1354 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_table_ref_in_table_ref_list1382 = new BitSet(new long[]{0x0000000000001002L});
    public static final BitSet FOLLOW_COMMA_in_table_ref_list1385 = new BitSet(new long[]{0x1000000005008000L,0x0400000000000000L});
    public static final BitSet FOLLOW_table_ref_in_table_ref_list1388 = new BitSet(new long[]{0x0000000000001002L});
    public static final BitSet FOLLOW_table_ref_aux_in_table_ref1410 = new BitSet(new long[]{0x1000000000000002L});
    public static final BitSet FOLLOW_join_clause_in_table_ref1412 = new BitSet(new long[]{0x1000000000000002L});
    public static final BitSet FOLLOW_dml_table_expression_clause_in_table_ref_aux1458 = new BitSet(new long[]{0x1000000001008402L,0x0000000000000100L});
    public static final BitSet FOLLOW_pivot_clause_in_table_ref_aux1461 = new BitSet(new long[]{0x1000000001008402L,0x0000000000000100L});
    public static final BitSet FOLLOW_unpivot_clause_in_table_ref_aux1463 = new BitSet(new long[]{0x1000000001008402L,0x0000000000000100L});
    public static final BitSet FOLLOW_only_key_in_table_ref_aux1476 = new BitSet(new long[]{0x0000000004000000L});
    public static final BitSet FOLLOW_LEFT_PAREN_in_table_ref_aux1478 = new BitSet(new long[]{0x1000000005008000L,0x0400000000000000L});
    public static final BitSet FOLLOW_dml_table_expression_clause_in_table_ref_aux1480 = new BitSet(new long[]{0x4000000000000000L});
    public static final BitSet FOLLOW_RIGHT_PAREN_in_table_ref_aux1482 = new BitSet(new long[]{0x1000000001008402L,0x0000000000000100L});
    public static final BitSet FOLLOW_flashback_query_clause_in_table_ref_aux1498 = new BitSet(new long[]{0x1000000001008402L,0x0000000000000100L});
    public static final BitSet FOLLOW_alias_in_table_ref_aux1512 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_query_partition_clause_in_join_clause1565 = new BitSet(new long[]{0x1000000000000000L});
    public static final BitSet FOLLOW_cross_key_in_join_clause1577 = new BitSet(new long[]{0x1000000000000000L});
    public static final BitSet FOLLOW_natural_key_in_join_clause1579 = new BitSet(new long[]{0x1000000000000000L});
    public static final BitSet FOLLOW_inner_key_in_join_clause1584 = new BitSet(new long[]{0x1000000000000000L});
    public static final BitSet FOLLOW_outer_join_type_in_join_clause1586 = new BitSet(new long[]{0x1000000000000000L});
    public static final BitSet FOLLOW_join_key_in_join_clause1590 = new BitSet(new long[]{0x1000000005008000L,0x0400000000000000L});
    public static final BitSet FOLLOW_table_ref_aux_in_join_clause1600 = new BitSet(new long[]{0x1000002000000002L,0x0000400000000000L});
    public static final BitSet FOLLOW_query_partition_clause_in_join_clause1610 = new BitSet(new long[]{0x0000002000000002L,0x0000400000000000L});
    public static final BitSet FOLLOW_join_on_part_in_join_clause1622 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_join_using_part_in_join_clause1633 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_on_key_in_join_on_part1699 = new BitSet(new long[]{0x1400000025088C20L,0x2008180030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_condition_in_join_on_part1701 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_using_key_in_join_using_part1742 = new BitSet(new long[]{0x0000000004000000L});
    public static final BitSet FOLLOW_LEFT_PAREN_in_join_using_part1745 = new BitSet(new long[]{0x1000000001008000L});
    public static final BitSet FOLLOW_column_name_in_join_using_part1748 = new BitSet(new long[]{0x4000000000001000L});
    public static final BitSet FOLLOW_COMMA_in_join_using_part1751 = new BitSet(new long[]{0x1000000001008000L});
    public static final BitSet FOLLOW_column_name_in_join_using_part1754 = new BitSet(new long[]{0x4000000000001000L});
    public static final BitSet FOLLOW_RIGHT_PAREN_in_join_using_part1758 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_full_key_in_outer_join_type1789 = new BitSet(new long[]{0x1000000000000002L});
    public static final BitSet FOLLOW_left_key_in_outer_join_type1800 = new BitSet(new long[]{0x1000000000000002L});
    public static final BitSet FOLLOW_right_key_in_outer_join_type1811 = new BitSet(new long[]{0x1000000000000002L});
    public static final BitSet FOLLOW_outer_key_in_outer_join_type1827 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_partition_key_in_query_partition_clause1849 = new BitSet(new long[]{0x0000000000000000L,0x0000000000002000L});
    public static final BitSet FOLLOW_by_key_in_query_partition_clause1851 = new BitSet(new long[]{0x1400000025088C20L,0x2008180030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_expression_list_in_query_partition_clause1867 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_expression_in_query_partition_clause1878 = new BitSet(new long[]{0x0000000000001002L});
    public static final BitSet FOLLOW_COMMA_in_query_partition_clause1881 = new BitSet(new long[]{0x1400000025088C20L,0x2008180030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_expression_in_query_partition_clause1883 = new BitSet(new long[]{0x0000000000001002L});
    public static final BitSet FOLLOW_versions_key_in_flashback_query_clause1935 = new BitSet(new long[]{0x0000000000000000L,0x0000000000001000L});
    public static final BitSet FOLLOW_between_key_in_flashback_query_clause1937 = new BitSet(new long[]{0x1000000000000000L});
    public static final BitSet FOLLOW_scn_key_in_flashback_query_clause1940 = new BitSet(new long[]{0x1400000025088C20L,0x2008180030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_timestamp_key_in_flashback_query_clause1942 = new BitSet(new long[]{0x1400000025088C20L,0x2008180030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_expression_in_flashback_query_clause1945 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_as_key_in_flashback_query_clause1975 = new BitSet(new long[]{0x0000000000000000L,0x0000200000000000L});
    public static final BitSet FOLLOW_of_key_in_flashback_query_clause1977 = new BitSet(new long[]{0x1000000000000000L});
    public static final BitSet FOLLOW_scn_key_in_flashback_query_clause1980 = new BitSet(new long[]{0x1400000025088C20L,0x2008180030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_timestamp_key_in_flashback_query_clause1982 = new BitSet(new long[]{0x1400000025088C20L,0x2008180030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_expression_in_flashback_query_clause1985 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_pivot_key_in_pivot_clause2023 = new BitSet(new long[]{0x1000000004000000L});
    public static final BitSet FOLLOW_xml_key_in_pivot_clause2025 = new BitSet(new long[]{0x0000000004000000L});
    public static final BitSet FOLLOW_LEFT_PAREN_in_pivot_clause2036 = new BitSet(new long[]{0x1000000001008000L});
    public static final BitSet FOLLOW_pivot_element_in_pivot_clause2050 = new BitSet(new long[]{0x0000000000001000L,0x0000000080000000L});
    public static final BitSet FOLLOW_COMMA_in_pivot_clause2053 = new BitSet(new long[]{0x1000000001008000L});
    public static final BitSet FOLLOW_pivot_element_in_pivot_clause2055 = new BitSet(new long[]{0x0000000000001000L,0x0000000080000000L});
    public static final BitSet FOLLOW_pivot_for_clause_in_pivot_clause2071 = new BitSet(new long[]{0x0000000000000000L,0x0000002000000000L});
    public static final BitSet FOLLOW_pivot_in_clause_in_pivot_clause2085 = new BitSet(new long[]{0x4000000000000000L});
    public static final BitSet FOLLOW_RIGHT_PAREN_in_pivot_clause2097 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_aggregate_function_name_in_pivot_element2141 = new BitSet(new long[]{0x0000000004000000L});
    public static final BitSet FOLLOW_LEFT_PAREN_in_pivot_element2143 = new BitSet(new long[]{0x1400000025088C20L,0x2008180030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_expression_in_pivot_element2145 = new BitSet(new long[]{0x4000000000000000L});
    public static final BitSet FOLLOW_RIGHT_PAREN_in_pivot_element2147 = new BitSet(new long[]{0x1000000001008402L,0x0000000000000100L});
    public static final BitSet FOLLOW_alias_in_pivot_element2149 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_for_key_in_pivot_for_clause2211 = new BitSet(new long[]{0x1000000005008000L});
    public static final BitSet FOLLOW_column_name_in_pivot_for_clause2223 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_LEFT_PAREN_in_pivot_for_clause2234 = new BitSet(new long[]{0x1000000001008000L});
    public static final BitSet FOLLOW_column_name_in_pivot_for_clause2236 = new BitSet(new long[]{0x4000000000001000L});
    public static final BitSet FOLLOW_COMMA_in_pivot_for_clause2239 = new BitSet(new long[]{0x1000000001008000L});
    public static final BitSet FOLLOW_column_name_in_pivot_for_clause2241 = new BitSet(new long[]{0x4000000000001000L});
    public static final BitSet FOLLOW_RIGHT_PAREN_in_pivot_for_clause2245 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_in_key_in_pivot_in_clause2296 = new BitSet(new long[]{0x0000000004000000L});
    public static final BitSet FOLLOW_LEFT_PAREN_in_pivot_in_clause2306 = new BitSet(new long[]{0x1400000025088C20L,0x2088180030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_subquery_in_pivot_in_clause2330 = new BitSet(new long[]{0x4000000000000000L});
    public static final BitSet FOLLOW_any_key_in_pivot_in_clause2356 = new BitSet(new long[]{0x4000000000001000L});
    public static final BitSet FOLLOW_COMMA_in_pivot_in_clause2359 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000080L});
    public static final BitSet FOLLOW_any_key_in_pivot_in_clause2361 = new BitSet(new long[]{0x4000000000001000L});
    public static final BitSet FOLLOW_pivot_in_clause_element_in_pivot_in_clause2384 = new BitSet(new long[]{0x4000000000001000L});
    public static final BitSet FOLLOW_COMMA_in_pivot_in_clause2387 = new BitSet(new long[]{0x1400000025088C20L,0x2008180030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_pivot_in_clause_element_in_pivot_in_clause2389 = new BitSet(new long[]{0x4000000000001000L});
    public static final BitSet FOLLOW_RIGHT_PAREN_in_pivot_in_clause2415 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_pivot_in_clause_elements_in_pivot_in_clause_element2495 = new BitSet(new long[]{0x1000000001008402L,0x0000000000000100L});
    public static final BitSet FOLLOW_alias_in_pivot_in_clause_element2497 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_expression_in_pivot_in_clause_elements2537 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_expression_list_in_pivot_in_clause_elements2561 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_unpivot_key_in_unpivot_clause2581 = new BitSet(new long[]{0x1000000004000000L});
    public static final BitSet FOLLOW_include_key_in_unpivot_clause2594 = new BitSet(new long[]{0x1000000000000000L});
    public static final BitSet FOLLOW_exclude_key_in_unpivot_clause2596 = new BitSet(new long[]{0x1000000000000000L});
    public static final BitSet FOLLOW_nulls_key_in_unpivot_clause2599 = new BitSet(new long[]{0x0000000004000000L});
    public static final BitSet FOLLOW_LEFT_PAREN_in_unpivot_clause2611 = new BitSet(new long[]{0x1000000005008000L});
    public static final BitSet FOLLOW_column_name_in_unpivot_clause2630 = new BitSet(new long[]{0x0000000000000000L,0x0000000080000000L});
    public static final BitSet FOLLOW_LEFT_PAREN_in_unpivot_clause2649 = new BitSet(new long[]{0x1000000001008000L});
    public static final BitSet FOLLOW_column_name_in_unpivot_clause2651 = new BitSet(new long[]{0x4000000000001000L});
    public static final BitSet FOLLOW_COMMA_in_unpivot_clause2654 = new BitSet(new long[]{0x1000000001008000L});
    public static final BitSet FOLLOW_column_name_in_unpivot_clause2656 = new BitSet(new long[]{0x4000000000001000L});
    public static final BitSet FOLLOW_RIGHT_PAREN_in_unpivot_clause2660 = new BitSet(new long[]{0x0000000000000000L,0x0000000080000000L});
    public static final BitSet FOLLOW_pivot_for_clause_in_unpivot_clause2688 = new BitSet(new long[]{0x0000000000000000L,0x0000002000000000L});
    public static final BitSet FOLLOW_unpivot_in_clause_in_unpivot_clause2702 = new BitSet(new long[]{0x4000000000000000L});
    public static final BitSet FOLLOW_RIGHT_PAREN_in_unpivot_clause2712 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_in_key_in_unpivot_in_clause2762 = new BitSet(new long[]{0x0000000004000000L});
    public static final BitSet FOLLOW_LEFT_PAREN_in_unpivot_in_clause2772 = new BitSet(new long[]{0x1000000005008000L});
    public static final BitSet FOLLOW_unpivot_in_elements_in_unpivot_in_clause2786 = new BitSet(new long[]{0x4000000000001000L});
    public static final BitSet FOLLOW_COMMA_in_unpivot_in_clause2789 = new BitSet(new long[]{0x1000000005008000L});
    public static final BitSet FOLLOW_unpivot_in_elements_in_unpivot_in_clause2791 = new BitSet(new long[]{0x4000000000001000L});
    public static final BitSet FOLLOW_RIGHT_PAREN_in_unpivot_in_clause2803 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_column_name_in_unpivot_in_elements2849 = new BitSet(new long[]{0x1400000025088C20L,0x2008180030904190L,0x0000000000000080L});
    public static final BitSet FOLLOW_LEFT_PAREN_in_unpivot_in_elements2864 = new BitSet(new long[]{0x1000000001008000L});
    public static final BitSet FOLLOW_column_name_in_unpivot_in_elements2866 = new BitSet(new long[]{0x4000000000001000L});
    public static final BitSet FOLLOW_COMMA_in_unpivot_in_elements2869 = new BitSet(new long[]{0x1000000001008000L});
    public static final BitSet FOLLOW_column_name_in_unpivot_in_elements2871 = new BitSet(new long[]{0x4000000000001000L});
    public static final BitSet FOLLOW_RIGHT_PAREN_in_unpivot_in_elements2875 = new BitSet(new long[]{0x1400000025088C20L,0x2008180030904190L,0x0000000000000080L});
    public static final BitSet FOLLOW_as_key_in_unpivot_in_elements2895 = new BitSet(new long[]{0x1400000025088C20L,0x2008180030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_expression_wrapper_in_unpivot_in_elements2911 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_expression_list_in_unpivot_in_elements2931 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_connect_key_in_hierarchical_query_clause2984 = new BitSet(new long[]{0x0000000000000000L,0x0000000000002000L});
    public static final BitSet FOLLOW_by_key_in_hierarchical_query_clause2986 = new BitSet(new long[]{0x1400000025088C20L,0x2008180030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_nocycle_key_in_hierarchical_query_clause2988 = new BitSet(new long[]{0x1400000025088C20L,0x2008180030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_condition_in_hierarchical_query_clause2991 = new BitSet(new long[]{0x0080000000000002L});
    public static final BitSet FOLLOW_start_part_in_hierarchical_query_clause2993 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_start_part_in_hierarchical_query_clause3035 = new BitSet(new long[]{0x0000000000000000L,0x0000000000010000L});
    public static final BitSet FOLLOW_connect_key_in_hierarchical_query_clause3037 = new BitSet(new long[]{0x0000000000000000L,0x0000000000002000L});
    public static final BitSet FOLLOW_by_key_in_hierarchical_query_clause3039 = new BitSet(new long[]{0x1400000025088C20L,0x2008180030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_nocycle_key_in_hierarchical_query_clause3041 = new BitSet(new long[]{0x1400000025088C20L,0x2008180030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_condition_in_hierarchical_query_clause3044 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_start_key_in_start_part3093 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000020L});
    public static final BitSet FOLLOW_with_key_in_start_part3095 = new BitSet(new long[]{0x1400000025088C20L,0x2008180030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_condition_in_start_part3097 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_group_key_in_group_by_clause3137 = new BitSet(new long[]{0x0000000000000000L,0x0000000000002000L});
    public static final BitSet FOLLOW_by_key_in_group_by_clause3139 = new BitSet(new long[]{0x1400000025088C20L,0x2008180030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_group_by_elements_in_group_by_clause3141 = new BitSet(new long[]{0x0000000000001002L});
    public static final BitSet FOLLOW_COMMA_in_group_by_clause3151 = new BitSet(new long[]{0x1400000025088C20L,0x2008180030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_group_by_elements_in_group_by_clause3153 = new BitSet(new long[]{0x0000000000001002L});
    public static final BitSet FOLLOW_grouping_sets_clause_in_group_by_elements3196 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_rollup_cube_clause_in_group_by_elements3207 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_expression_in_group_by_elements3219 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_rollup_key_in_rollup_cube_clause3248 = new BitSet(new long[]{0x0000000004000000L});
    public static final BitSet FOLLOW_cube_key_in_rollup_cube_clause3251 = new BitSet(new long[]{0x0000000004000000L});
    public static final BitSet FOLLOW_LEFT_PAREN_in_rollup_cube_clause3255 = new BitSet(new long[]{0x1400000025088C20L,0x2008180030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_grouping_sets_elements_in_rollup_cube_clause3258 = new BitSet(new long[]{0x4000000000001000L});
    public static final BitSet FOLLOW_COMMA_in_rollup_cube_clause3261 = new BitSet(new long[]{0x1400000025088C20L,0x2008180030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_grouping_sets_elements_in_rollup_cube_clause3264 = new BitSet(new long[]{0x4000000000001000L});
    public static final BitSet FOLLOW_RIGHT_PAREN_in_rollup_cube_clause3268 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_grouping_key_in_grouping_sets_clause3290 = new BitSet(new long[]{0x1000000000000000L});
    public static final BitSet FOLLOW_sets_key_in_grouping_sets_clause3292 = new BitSet(new long[]{0x0000000004000000L});
    public static final BitSet FOLLOW_LEFT_PAREN_in_grouping_sets_clause3303 = new BitSet(new long[]{0x1400000025088C20L,0x2008180030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_grouping_sets_elements_in_grouping_sets_clause3305 = new BitSet(new long[]{0x4000000000001000L});
    public static final BitSet FOLLOW_COMMA_in_grouping_sets_clause3308 = new BitSet(new long[]{0x1400000025088C20L,0x2008180030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_grouping_sets_elements_in_grouping_sets_clause3310 = new BitSet(new long[]{0x4000000000001000L});
    public static final BitSet FOLLOW_RIGHT_PAREN_in_grouping_sets_clause3314 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_rollup_cube_clause_in_grouping_sets_elements3362 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_expression_list_in_grouping_sets_elements3378 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_expression_in_grouping_sets_elements3389 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_having_key_in_having_clause3417 = new BitSet(new long[]{0x1400000025088C20L,0x2008180030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_condition_in_having_clause3419 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_model_key_in_model_clause3459 = new BitSet(new long[]{0x1000000000000000L,0x8000000000000000L});
    public static final BitSet FOLLOW_cell_reference_options_in_model_clause3461 = new BitSet(new long[]{0x1000000000000000L,0x8000000000000000L});
    public static final BitSet FOLLOW_return_rows_clause_in_model_clause3464 = new BitSet(new long[]{0x1000000000000000L});
    public static final BitSet FOLLOW_reference_model_in_model_clause3467 = new BitSet(new long[]{0x1000000000000000L});
    public static final BitSet FOLLOW_main_model_in_model_clause3470 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_ignore_key_in_cell_reference_options3516 = new BitSet(new long[]{0x1000000000000000L});
    public static final BitSet FOLLOW_keep_key_in_cell_reference_options3519 = new BitSet(new long[]{0x1000000000000000L});
    public static final BitSet FOLLOW_nav_key_in_cell_reference_options3523 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_unique_key_in_cell_reference_options3534 = new BitSet(new long[]{0x1000000000000000L});
    public static final BitSet FOLLOW_dimension_key_in_cell_reference_options3538 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_single_key_in_cell_reference_options3540 = new BitSet(new long[]{0x1000000000000000L});
    public static final BitSet FOLLOW_reference_key_in_cell_reference_options3542 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_return_key_in_return_rows_clause3565 = new BitSet(new long[]{0x1000000000000000L,0x0000000000000010L});
    public static final BitSet FOLLOW_updated_key_in_return_rows_clause3569 = new BitSet(new long[]{0x1000000000000000L});
    public static final BitSet FOLLOW_all_key_in_return_rows_clause3571 = new BitSet(new long[]{0x1000000000000000L});
    public static final BitSet FOLLOW_rows_key_in_return_rows_clause3574 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_reference_key_in_reference_model3595 = new BitSet(new long[]{0x1000000001008000L});
    public static final BitSet FOLLOW_reference_model_name_in_reference_model3598 = new BitSet(new long[]{0x0000000000000000L,0x0000400000000000L});
    public static final BitSet FOLLOW_on_key_in_reference_model3600 = new BitSet(new long[]{0x0000000004000000L});
    public static final BitSet FOLLOW_LEFT_PAREN_in_reference_model3616 = new BitSet(new long[]{0x0000000004000000L,0x0080000000000000L});
    public static final BitSet FOLLOW_subquery_in_reference_model3619 = new BitSet(new long[]{0x4000000000000000L});
    public static final BitSet FOLLOW_RIGHT_PAREN_in_reference_model3621 = new BitSet(new long[]{0x1000000000000000L});
    public static final BitSet FOLLOW_model_column_clauses_in_reference_model3624 = new BitSet(new long[]{0x1000000000000002L,0x8000000000000000L});
    public static final BitSet FOLLOW_cell_reference_options_in_reference_model3639 = new BitSet(new long[]{0x1000000000000002L,0x8000000000000000L});
    public static final BitSet FOLLOW_main_key_in_main_model3661 = new BitSet(new long[]{0x1000000001008000L});
    public static final BitSet FOLLOW_main_model_name_in_main_model3663 = new BitSet(new long[]{0x1000000000000000L});
    public static final BitSet FOLLOW_model_column_clauses_in_main_model3667 = new BitSet(new long[]{0x1000000004000000L,0x8000000000000000L});
    public static final BitSet FOLLOW_cell_reference_options_in_main_model3669 = new BitSet(new long[]{0x1000000004000000L,0x8000000000000000L});
    public static final BitSet FOLLOW_model_rules_clause_in_main_model3672 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_model_column_partition_part_in_model_column_clauses3716 = new BitSet(new long[]{0x1000000000000000L});
    public static final BitSet FOLLOW_dimension_key_in_model_column_clauses3727 = new BitSet(new long[]{0x0000000000000000L,0x0000000000002000L});
    public static final BitSet FOLLOW_by_key_in_model_column_clauses3729 = new BitSet(new long[]{0x0000000004000000L});
    public static final BitSet FOLLOW_model_column_list_in_model_column_clauses3731 = new BitSet(new long[]{0x1000000000000000L});
    public static final BitSet FOLLOW_measures_key_in_model_column_clauses3733 = new BitSet(new long[]{0x0000000004000000L});
    public static final BitSet FOLLOW_model_column_list_in_model_column_clauses3735 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_partition_key_in_model_column_partition_part3784 = new BitSet(new long[]{0x0000000000000000L,0x0000000000002000L});
    public static final BitSet FOLLOW_by_key_in_model_column_partition_part3787 = new BitSet(new long[]{0x0000000004000000L});
    public static final BitSet FOLLOW_model_column_list_in_model_column_partition_part3790 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_LEFT_PAREN_in_model_column_list3810 = new BitSet(new long[]{0x1400000025088C20L,0x2008180030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_model_column_in_model_column_list3812 = new BitSet(new long[]{0x4000000000001000L});
    public static final BitSet FOLLOW_COMMA_in_model_column_list3815 = new BitSet(new long[]{0x1400000025088C20L,0x2008180030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_model_column_in_model_column_list3817 = new BitSet(new long[]{0x4000000000001000L});
    public static final BitSet FOLLOW_RIGHT_PAREN_in_model_column_list3822 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_expression_in_model_column3859 = new BitSet(new long[]{0x1000000001008402L,0x0000000000000100L});
    public static final BitSet FOLLOW_alias_in_model_column3861 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_model_rules_part_in_model_rules_clause3906 = new BitSet(new long[]{0x0000000004000000L});
    public static final BitSet FOLLOW_LEFT_PAREN_in_model_rules_clause3909 = new BitSet(new long[]{0x1400000025088C20L,0x2008100030904090L,0x0000000000000081L});
    public static final BitSet FOLLOW_model_rules_element_in_model_rules_clause3911 = new BitSet(new long[]{0x4000000000001000L});
    public static final BitSet FOLLOW_COMMA_in_model_rules_clause3914 = new BitSet(new long[]{0x1400000025088C20L,0x2008100030904090L,0x0000000000000081L});
    public static final BitSet FOLLOW_model_rules_element_in_model_rules_clause3916 = new BitSet(new long[]{0x4000000000001000L});
    public static final BitSet FOLLOW_RIGHT_PAREN_in_model_rules_clause3920 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_rules_key_in_model_rules_part3960 = new BitSet(new long[]{0x1000000000000002L,0x0000000000000000L,0x0000000000000001L});
    public static final BitSet FOLLOW_update_key_in_model_rules_part3963 = new BitSet(new long[]{0x1000000000000002L});
    public static final BitSet FOLLOW_upsert_key_in_model_rules_part3965 = new BitSet(new long[]{0x1000000000000002L,0x0000000000000010L});
    public static final BitSet FOLLOW_all_key_in_model_rules_part3967 = new BitSet(new long[]{0x1000000000000002L});
    public static final BitSet FOLLOW_automatic_key_in_model_rules_part3974 = new BitSet(new long[]{0x0000000000000000L,0x0002000000000000L});
    public static final BitSet FOLLOW_sequential_key_in_model_rules_part3976 = new BitSet(new long[]{0x0000000000000000L,0x0002000000000000L});
    public static final BitSet FOLLOW_order_key_in_model_rules_part3979 = new BitSet(new long[]{0x1000000000000002L});
    public static final BitSet FOLLOW_model_iterate_clause_in_model_rules_part3983 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_update_key_in_model_rules_element4037 = new BitSet(new long[]{0x1400000025088C20L,0x2008100030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_upsert_key_in_model_rules_element4039 = new BitSet(new long[]{0x1400000025088C20L,0x2008100030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_all_key_in_model_rules_element4047 = new BitSet(new long[]{0x1400000025088C20L,0x2008100030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_cell_assignment_in_model_rules_element4061 = new BitSet(new long[]{0x0000000000040000L,0x0002000000000000L});
    public static final BitSet FOLLOW_order_by_clause_in_model_rules_element4079 = new BitSet(new long[]{0x0000000000040000L});
    public static final BitSet FOLLOW_EQUALS_OP_in_model_rules_element4094 = new BitSet(new long[]{0x1400000025088C20L,0x2008180030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_expression_in_model_rules_element4096 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_model_expression_in_cell_assignment4155 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_iterate_key_in_model_iterate_clause4175 = new BitSet(new long[]{0x0000000004000000L});
    public static final BitSet FOLLOW_LEFT_PAREN_in_model_iterate_clause4177 = new BitSet(new long[]{0x1400000025088C20L,0x2008180030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_expression_in_model_iterate_clause4179 = new BitSet(new long[]{0x4000000000000000L});
    public static final BitSet FOLLOW_RIGHT_PAREN_in_model_iterate_clause4181 = new BitSet(new long[]{0x1000000000000002L});
    public static final BitSet FOLLOW_until_part_in_model_iterate_clause4183 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_until_key_in_until_part4226 = new BitSet(new long[]{0x0000000004000000L});
    public static final BitSet FOLLOW_LEFT_PAREN_in_until_part4228 = new BitSet(new long[]{0x1400000025088C20L,0x2008180030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_condition_in_until_part4230 = new BitSet(new long[]{0x4000000000000000L});
    public static final BitSet FOLLOW_RIGHT_PAREN_in_until_part4232 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_order_key_in_order_by_clause4272 = new BitSet(new long[]{0x1000000000000000L,0x0000000000002000L});
    public static final BitSet FOLLOW_siblings_key_in_order_by_clause4274 = new BitSet(new long[]{0x0000000000000000L,0x0000000000002000L});
    public static final BitSet FOLLOW_by_key_in_order_by_clause4277 = new BitSet(new long[]{0x1400000025088C20L,0x2008180030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_order_by_elements_in_order_by_clause4279 = new BitSet(new long[]{0x0000000000001002L});
    public static final BitSet FOLLOW_COMMA_in_order_by_clause4282 = new BitSet(new long[]{0x1400000025088C20L,0x2008180030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_order_by_elements_in_order_by_clause4284 = new BitSet(new long[]{0x0000000000001002L});
    public static final BitSet FOLLOW_expression_in_order_by_elements4330 = new BitSet(new long[]{0x1000000000000002L,0x0000000000400200L});
    public static final BitSet FOLLOW_asc_key_in_order_by_elements4333 = new BitSet(new long[]{0x1000000000000002L});
    public static final BitSet FOLLOW_desc_key_in_order_by_elements4335 = new BitSet(new long[]{0x1000000000000002L});
    public static final BitSet FOLLOW_nulls_key_in_order_by_elements4340 = new BitSet(new long[]{0x1000000000000000L});
    public static final BitSet FOLLOW_first_key_in_order_by_elements4343 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_last_key_in_order_by_elements4345 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_for_key_in_for_update_clause4403 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000001L});
    public static final BitSet FOLLOW_update_key_in_for_update_clause4405 = new BitSet(new long[]{0x1010000000000002L,0x0000200000000000L});
    public static final BitSet FOLLOW_for_update_of_part_in_for_update_clause4407 = new BitSet(new long[]{0x1010000000000002L});
    public static final BitSet FOLLOW_for_update_options_in_for_update_clause4410 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_of_key_in_for_update_of_part4451 = new BitSet(new long[]{0x1000000001008000L});
    public static final BitSet FOLLOW_column_name_in_for_update_of_part4454 = new BitSet(new long[]{0x0000000000001002L});
    public static final BitSet FOLLOW_COMMA_in_for_update_of_part4457 = new BitSet(new long[]{0x1000000001008000L});
    public static final BitSet FOLLOW_column_name_in_for_update_of_part4460 = new BitSet(new long[]{0x0000000000001002L});
    public static final BitSet FOLLOW_skip_key_in_for_update_options4482 = new BitSet(new long[]{0x1000000000000000L});
    public static final BitSet FOLLOW_locked_key_in_for_update_options4484 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_nowait_key_in_for_update_options4496 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_wait_key_in_for_update_options4507 = new BitSet(new long[]{0x1400000025088C20L,0x2008180030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_expression_in_for_update_options4509 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_update_key_in_update_statement4543 = new BitSet(new long[]{0x1000000005008000L,0x0400000000000000L});
    public static final BitSet FOLLOW_general_table_ref_in_update_statement4546 = new BitSet(new long[]{0x1000000000000000L});
    public static final BitSet FOLLOW_update_set_clause_in_update_statement4556 = new BitSet(new long[]{0x1000000000000002L,0x0000000000000000L,0x0000000000000010L});
    public static final BitSet FOLLOW_where_clause_in_update_statement4566 = new BitSet(new long[]{0x1000000000000002L});
    public static final BitSet FOLLOW_static_returning_clause_in_update_statement4569 = new BitSet(new long[]{0x1000000000000002L});
    public static final BitSet FOLLOW_error_logging_clause_in_update_statement4572 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_set_key_in_update_set_clause4602 = new BitSet(new long[]{0x1000000005008000L});
    public static final BitSet FOLLOW_column_based_update_set_clause_in_update_set_clause4613 = new BitSet(new long[]{0x0000000000001002L});
    public static final BitSet FOLLOW_COMMA_in_update_set_clause4616 = new BitSet(new long[]{0x1000000005008000L});
    public static final BitSet FOLLOW_column_based_update_set_clause_in_update_set_clause4618 = new BitSet(new long[]{0x0000000000001002L});
    public static final BitSet FOLLOW_value_key_in_update_set_clause4633 = new BitSet(new long[]{0x0000000004000000L});
    public static final BitSet FOLLOW_LEFT_PAREN_in_update_set_clause4635 = new BitSet(new long[]{0x1000000001008000L});
    public static final BitSet FOLLOW_id_in_update_set_clause4637 = new BitSet(new long[]{0x4000000000000000L});
    public static final BitSet FOLLOW_RIGHT_PAREN_in_update_set_clause4639 = new BitSet(new long[]{0x0000000000040000L});
    public static final BitSet FOLLOW_EQUALS_OP_in_update_set_clause4641 = new BitSet(new long[]{0x1400000025088C20L,0x2008180030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_expression_in_update_set_clause4643 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_column_name_in_column_based_update_set_clause4713 = new BitSet(new long[]{0x0000000000040000L});
    public static final BitSet FOLLOW_EQUALS_OP_in_column_based_update_set_clause4715 = new BitSet(new long[]{0x1400000025088C20L,0x2008180030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_expression_in_column_based_update_set_clause4717 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_LEFT_PAREN_in_column_based_update_set_clause4743 = new BitSet(new long[]{0x1000000001008000L});
    public static final BitSet FOLLOW_column_name_in_column_based_update_set_clause4745 = new BitSet(new long[]{0x4000000000001000L});
    public static final BitSet FOLLOW_COMMA_in_column_based_update_set_clause4748 = new BitSet(new long[]{0x1000000001008000L});
    public static final BitSet FOLLOW_column_name_in_column_based_update_set_clause4750 = new BitSet(new long[]{0x4000000000001000L});
    public static final BitSet FOLLOW_RIGHT_PAREN_in_column_based_update_set_clause4754 = new BitSet(new long[]{0x0000000000040000L});
    public static final BitSet FOLLOW_EQUALS_OP_in_column_based_update_set_clause4756 = new BitSet(new long[]{0x0000000004000000L,0x0080000000000000L});
    public static final BitSet FOLLOW_subquery_in_column_based_update_set_clause4758 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_delete_key_in_delete_statement4792 = new BitSet(new long[]{0x1000000005008000L,0x0400000100000000L});
    public static final BitSet FOLLOW_from_key_in_delete_statement4795 = new BitSet(new long[]{0x1000000005008000L,0x0400000000000000L});
    public static final BitSet FOLLOW_general_table_ref_in_delete_statement4807 = new BitSet(new long[]{0x1000000000000002L,0x0000000000000000L,0x0000000000000010L});
    public static final BitSet FOLLOW_where_clause_in_delete_statement4817 = new BitSet(new long[]{0x1000000000000002L});
    public static final BitSet FOLLOW_static_returning_clause_in_delete_statement4820 = new BitSet(new long[]{0x1000000000000002L});
    public static final BitSet FOLLOW_error_logging_clause_in_delete_statement4823 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_insert_key_in_insert_statement4844 = new BitSet(new long[]{0x1000000000000000L,0x0000010000000010L,0x0000000000000008L});
    public static final BitSet FOLLOW_single_table_insert_in_insert_statement4855 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_multi_table_insert_in_insert_statement4866 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_insert_into_clause_in_single_table_insert4911 = new BitSet(new long[]{0x0000000004000000L,0x0080000000000000L,0x0000000000000022L});
    public static final BitSet FOLLOW_values_clause_in_single_table_insert4922 = new BitSet(new long[]{0x1000000000000002L});
    public static final BitSet FOLLOW_static_returning_clause_in_single_table_insert4924 = new BitSet(new long[]{0x1000000000000002L});
    public static final BitSet FOLLOW_select_statement_in_single_table_insert4936 = new BitSet(new long[]{0x1000000000000002L});
    public static final BitSet FOLLOW_error_logging_clause_in_single_table_insert4952 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_all_key_in_multi_table_insert5014 = new BitSet(new long[]{0x0000000000000000L,0x0000010000000000L});
    public static final BitSet FOLLOW_multi_table_element_in_multi_table_insert5016 = new BitSet(new long[]{0x0000000004000000L,0x0080010000000000L,0x0000000000000020L});
    public static final BitSet FOLLOW_conditional_insert_clause_in_multi_table_insert5028 = new BitSet(new long[]{0x0000000004000000L,0x0080000000000000L,0x0000000000000020L});
    public static final BitSet FOLLOW_select_statement_in_multi_table_insert5044 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_insert_into_clause_in_multi_table_element5089 = new BitSet(new long[]{0x1000000000000002L,0x0000000000000000L,0x0000000000000002L});
    public static final BitSet FOLLOW_values_clause_in_multi_table_element5091 = new BitSet(new long[]{0x1000000000000002L});
    public static final BitSet FOLLOW_error_logging_clause_in_multi_table_element5094 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_all_key_in_conditional_insert_clause5138 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000008L});
    public static final BitSet FOLLOW_first_key_in_conditional_insert_clause5140 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000008L});
    public static final BitSet FOLLOW_conditional_insert_when_part_in_conditional_insert_clause5152 = new BitSet(new long[]{0x0000000000000002L,0x0000000002000000L,0x0000000000000008L});
    public static final BitSet FOLLOW_conditional_insert_else_part_in_conditional_insert_clause5155 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_when_key_in_conditional_insert_when_part5203 = new BitSet(new long[]{0x1400000025088C20L,0x2008180030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_condition_in_conditional_insert_when_part5205 = new BitSet(new long[]{0x0000000000000000L,0x0800000000000000L});
    public static final BitSet FOLLOW_then_key_in_conditional_insert_when_part5207 = new BitSet(new long[]{0x0000000000000000L,0x0000010000000000L});
    public static final BitSet FOLLOW_multi_table_element_in_conditional_insert_when_part5209 = new BitSet(new long[]{0x0000000000000002L,0x0000010000000000L});
    public static final BitSet FOLLOW_else_key_in_conditional_insert_else_part5253 = new BitSet(new long[]{0x0000000000000000L,0x0000010000000000L});
    public static final BitSet FOLLOW_multi_table_element_in_conditional_insert_else_part5256 = new BitSet(new long[]{0x0000000000000002L,0x0000010000000000L});
    public static final BitSet FOLLOW_into_key_in_insert_into_clause5277 = new BitSet(new long[]{0x1000000005008000L,0x0400000000000000L});
    public static final BitSet FOLLOW_general_table_ref_in_insert_into_clause5279 = new BitSet(new long[]{0x0000000004000002L});
    public static final BitSet FOLLOW_LEFT_PAREN_in_insert_into_clause5291 = new BitSet(new long[]{0x1000000001008000L});
    public static final BitSet FOLLOW_column_name_in_insert_into_clause5293 = new BitSet(new long[]{0x4000000000001000L});
    public static final BitSet FOLLOW_COMMA_in_insert_into_clause5296 = new BitSet(new long[]{0x1000000001008000L});
    public static final BitSet FOLLOW_column_name_in_insert_into_clause5298 = new BitSet(new long[]{0x4000000000001000L});
    public static final BitSet FOLLOW_RIGHT_PAREN_in_insert_into_clause5302 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_values_key_in_values_clause5347 = new BitSet(new long[]{0x0000000004000000L});
    public static final BitSet FOLLOW_expression_list_in_values_clause5350 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_merge_key_in_merge_statement5371 = new BitSet(new long[]{0x0000000000000000L,0x0000010000000000L});
    public static final BitSet FOLLOW_into_key_in_merge_statement5373 = new BitSet(new long[]{0x1000000001008000L});
    public static final BitSet FOLLOW_tableview_name_in_merge_statement5375 = new BitSet(new long[]{0x1000002001008400L,0x0000000000000100L});
    public static final BitSet FOLLOW_alias_in_merge_statement5377 = new BitSet(new long[]{0x0000002000000000L});
    public static final BitSet FOLLOW_using_key_in_merge_statement5388 = new BitSet(new long[]{0x1000000005008000L,0x0080000000000000L});
    public static final BitSet FOLLOW_selected_tableview_in_merge_statement5390 = new BitSet(new long[]{0x0000000000000000L,0x0000400000000000L});
    public static final BitSet FOLLOW_on_key_in_merge_statement5392 = new BitSet(new long[]{0x0000000004000000L});
    public static final BitSet FOLLOW_LEFT_PAREN_in_merge_statement5394 = new BitSet(new long[]{0x1400000025088C20L,0x2008180030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_condition_in_merge_statement5396 = new BitSet(new long[]{0x4000000000000000L});
    public static final BitSet FOLLOW_RIGHT_PAREN_in_merge_statement5398 = new BitSet(new long[]{0x1000000000000002L,0x0000000000000000L,0x0000000000000008L});
    public static final BitSet FOLLOW_merge_update_clause_in_merge_statement5408 = new BitSet(new long[]{0x1000000000000002L,0x0000000000000000L,0x0000000000000008L});
    public static final BitSet FOLLOW_merge_insert_clause_in_merge_statement5411 = new BitSet(new long[]{0x1000000000000002L});
    public static final BitSet FOLLOW_error_logging_clause_in_merge_statement5414 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_when_key_in_merge_update_clause5494 = new BitSet(new long[]{0x1000000000000000L});
    public static final BitSet FOLLOW_matched_key_in_merge_update_clause5496 = new BitSet(new long[]{0x0000000000000000L,0x0800000000000000L});
    public static final BitSet FOLLOW_then_key_in_merge_update_clause5498 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000001L});
    public static final BitSet FOLLOW_update_key_in_merge_update_clause5500 = new BitSet(new long[]{0x1000000000000000L});
    public static final BitSet FOLLOW_set_key_in_merge_update_clause5502 = new BitSet(new long[]{0x1000000001008000L});
    public static final BitSet FOLLOW_merge_element_in_merge_update_clause5513 = new BitSet(new long[]{0x0000000000001002L,0x0000000000200000L,0x0000000000000010L});
    public static final BitSet FOLLOW_COMMA_in_merge_update_clause5516 = new BitSet(new long[]{0x1000000001008000L});
    public static final BitSet FOLLOW_merge_element_in_merge_update_clause5518 = new BitSet(new long[]{0x0000000000001002L,0x0000000000200000L,0x0000000000000010L});
    public static final BitSet FOLLOW_where_clause_in_merge_update_clause5530 = new BitSet(new long[]{0x0000000000000002L,0x0000000000200000L});
    public static final BitSet FOLLOW_merge_update_delete_part_in_merge_update_clause5533 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_column_name_in_merge_element5576 = new BitSet(new long[]{0x0000000000040000L});
    public static final BitSet FOLLOW_EQUALS_OP_in_merge_element5578 = new BitSet(new long[]{0x1400000025088C20L,0x2008180030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_expression_in_merge_element5580 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_delete_key_in_merge_update_delete_part5623 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000010L});
    public static final BitSet FOLLOW_where_clause_in_merge_update_delete_part5626 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_when_key_in_merge_insert_clause5646 = new BitSet(new long[]{0x0000000000000000L,0x0000080000000000L});
    public static final BitSet FOLLOW_not_key_in_merge_insert_clause5648 = new BitSet(new long[]{0x1000000000000000L});
    public static final BitSet FOLLOW_matched_key_in_merge_insert_clause5650 = new BitSet(new long[]{0x0000000000000000L,0x0800000000000000L});
    public static final BitSet FOLLOW_then_key_in_merge_insert_clause5652 = new BitSet(new long[]{0x0000000000000000L,0x0000004000000000L});
    public static final BitSet FOLLOW_insert_key_in_merge_insert_clause5654 = new BitSet(new long[]{0x0000000004000000L,0x0000000000000000L,0x0000000000000002L});
    public static final BitSet FOLLOW_LEFT_PAREN_in_merge_insert_clause5666 = new BitSet(new long[]{0x1000000001008000L});
    public static final BitSet FOLLOW_column_name_in_merge_insert_clause5668 = new BitSet(new long[]{0x4000000000001000L});
    public static final BitSet FOLLOW_COMMA_in_merge_insert_clause5671 = new BitSet(new long[]{0x1000000001008000L});
    public static final BitSet FOLLOW_column_name_in_merge_insert_clause5673 = new BitSet(new long[]{0x4000000000001000L});
    public static final BitSet FOLLOW_RIGHT_PAREN_in_merge_insert_clause5677 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000002L});
    public static final BitSet FOLLOW_values_key_in_merge_insert_clause5689 = new BitSet(new long[]{0x0000000004000000L});
    public static final BitSet FOLLOW_expression_list_in_merge_insert_clause5691 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000000L,0x0000000000000010L});
    public static final BitSet FOLLOW_where_clause_in_merge_insert_clause5693 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_tableview_name_in_selected_tableview5743 = new BitSet(new long[]{0x1000000001008402L,0x0000000000000100L});
    public static final BitSet FOLLOW_subquery_in_selected_tableview5747 = new BitSet(new long[]{0x1000000001008402L,0x0000000000000100L});
    public static final BitSet FOLLOW_alias_in_selected_tableview5751 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_lock_key_in_lock_table_statement5797 = new BitSet(new long[]{0x0000000000000000L,0x0400000000000000L});
    public static final BitSet FOLLOW_table_key_in_lock_table_statement5799 = new BitSet(new long[]{0x1000000001008000L});
    public static final BitSet FOLLOW_lock_table_element_in_lock_table_statement5810 = new BitSet(new long[]{0x0000000000001000L,0x0000002000000000L});
    public static final BitSet FOLLOW_COMMA_in_lock_table_statement5813 = new BitSet(new long[]{0x1000000001008000L});
    public static final BitSet FOLLOW_lock_table_element_in_lock_table_statement5815 = new BitSet(new long[]{0x0000000000001000L,0x0000002000000000L});
    public static final BitSet FOLLOW_in_key_in_lock_table_statement5828 = new BitSet(new long[]{0x1040080000000000L});
    public static final BitSet FOLLOW_lock_mode_in_lock_table_statement5830 = new BitSet(new long[]{0x0004000000000000L});
    public static final BitSet FOLLOW_mode_key_in_lock_table_statement5832 = new BitSet(new long[]{0x1010000000000002L});
    public static final BitSet FOLLOW_wait_nowait_part_in_lock_table_statement5834 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_wait_key_in_wait_nowait_part5877 = new BitSet(new long[]{0x1400000025088C20L,0x2008180030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_expression_in_wait_nowait_part5879 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_nowait_key_in_wait_nowait_part5902 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_tableview_name_in_lock_table_element5924 = new BitSet(new long[]{0x1000000000000002L});
    public static final BitSet FOLLOW_partition_extension_clause_in_lock_table_element5926 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_row_key_in_lock_mode5966 = new BitSet(new long[]{0x0040000000000000L});
    public static final BitSet FOLLOW_share_key_in_lock_mode5968 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_row_key_in_lock_mode5979 = new BitSet(new long[]{0x0000080000000000L});
    public static final BitSet FOLLOW_exclusive_key_in_lock_mode5981 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_share_key_in_lock_mode5992 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000000L,0x0000000000000001L});
    public static final BitSet FOLLOW_update_key_in_lock_mode5994 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_share_key_in_lock_mode6006 = new BitSet(new long[]{0x1000000000000000L});
    public static final BitSet FOLLOW_row_key_in_lock_mode6008 = new BitSet(new long[]{0x0000080000000000L});
    public static final BitSet FOLLOW_exclusive_key_in_lock_mode6010 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_exclusive_key_in_lock_mode6021 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_dml_table_expression_clause_in_general_table_ref6049 = new BitSet(new long[]{0x1000000001008402L,0x0000000000000100L});
    public static final BitSet FOLLOW_only_key_in_general_table_ref6064 = new BitSet(new long[]{0x0000000004000000L});
    public static final BitSet FOLLOW_LEFT_PAREN_in_general_table_ref6066 = new BitSet(new long[]{0x1000000005008000L,0x0400000000000000L});
    public static final BitSet FOLLOW_dml_table_expression_clause_in_general_table_ref6068 = new BitSet(new long[]{0x4000000000000000L});
    public static final BitSet FOLLOW_RIGHT_PAREN_in_general_table_ref6070 = new BitSet(new long[]{0x1000000001008402L,0x0000000000000100L});
    public static final BitSet FOLLOW_alias_in_general_table_ref6085 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_returning_key_in_static_returning_clause6129 = new BitSet(new long[]{0x1400000025088C20L,0x2008180030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_return_key_in_static_returning_clause6131 = new BitSet(new long[]{0x1400000025088C20L,0x2008180030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_expression_in_static_returning_clause6134 = new BitSet(new long[]{0x1000000000001000L,0x0000010000000000L});
    public static final BitSet FOLLOW_COMMA_in_static_returning_clause6137 = new BitSet(new long[]{0x1400000025088C20L,0x2008180030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_expression_in_static_returning_clause6139 = new BitSet(new long[]{0x1000000000001000L,0x0000010000000000L});
    public static final BitSet FOLLOW_into_clause_in_static_returning_clause6152 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_log_key_in_error_logging_clause6195 = new BitSet(new long[]{0x1000000000000000L});
    public static final BitSet FOLLOW_errors_key_in_error_logging_clause6197 = new BitSet(new long[]{0x1400000025088C22L,0x2008190030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_error_logging_into_part_in_error_logging_clause6208 = new BitSet(new long[]{0x1400000025088C22L,0x2008180030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_expression_wrapper_in_error_logging_clause6225 = new BitSet(new long[]{0x1000000000000002L});
    public static final BitSet FOLLOW_error_logging_reject_part_in_error_logging_clause6237 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_into_key_in_error_logging_into_part6281 = new BitSet(new long[]{0x1000000001008000L});
    public static final BitSet FOLLOW_tableview_name_in_error_logging_into_part6284 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_reject_key_in_error_logging_reject_part6304 = new BitSet(new long[]{0x1000000000000000L});
    public static final BitSet FOLLOW_limit_key_in_error_logging_reject_part6307 = new BitSet(new long[]{0x1400000025088C20L,0x2008180030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_unlimited_key_in_error_logging_reject_part6315 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_expression_wrapper_in_error_logging_reject_part6317 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_table_collection_expression_in_dml_table_expression_clause6338 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_LEFT_PAREN_in_dml_table_expression_clause6361 = new BitSet(new long[]{0x0000000004000000L,0x0080000000000000L,0x0000000000000020L});
    public static final BitSet FOLLOW_select_statement_in_dml_table_expression_clause6363 = new BitSet(new long[]{0x4000000000000000L,0x0000000000000000L,0x0000000000000020L});
    public static final BitSet FOLLOW_subquery_restriction_clause_in_dml_table_expression_clause6365 = new BitSet(new long[]{0x4000000000000000L});
    public static final BitSet FOLLOW_RIGHT_PAREN_in_dml_table_expression_clause6368 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_tableview_name_in_dml_table_expression_clause6394 = new BitSet(new long[]{0x1000000000000002L});
    public static final BitSet FOLLOW_sample_clause_in_dml_table_expression_clause6396 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_table_key_in_table_collection_expression6432 = new BitSet(new long[]{0x0000000004000000L});
    public static final BitSet FOLLOW_LEFT_PAREN_in_table_collection_expression6442 = new BitSet(new long[]{0x1400000025088C20L,0x2008180030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_expression_in_table_collection_expression6444 = new BitSet(new long[]{0x4000000000000000L});
    public static final BitSet FOLLOW_RIGHT_PAREN_in_table_collection_expression6446 = new BitSet(new long[]{0x0000000004000002L});
    public static final BitSet FOLLOW_LEFT_PAREN_in_table_collection_expression6459 = new BitSet(new long[]{0x0400000000000000L});
    public static final BitSet FOLLOW_PLUS_SIGN_in_table_collection_expression6461 = new BitSet(new long[]{0x4000000000000000L});
    public static final BitSet FOLLOW_RIGHT_PAREN_in_table_collection_expression6463 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_with_key_in_subquery_restriction_clause6505 = new BitSet(new long[]{0x1000000000000000L,0x0000000000008000L});
    public static final BitSet FOLLOW_read_key_in_subquery_restriction_clause6516 = new BitSet(new long[]{0x1000000000000000L});
    public static final BitSet FOLLOW_only_key_in_subquery_restriction_clause6518 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_check_key_in_subquery_restriction_clause6529 = new BitSet(new long[]{0x0000000000000000L,0x0000800000000000L});
    public static final BitSet FOLLOW_option_key_in_subquery_restriction_clause6531 = new BitSet(new long[]{0x1000000000000002L});
    public static final BitSet FOLLOW_constraint_key_in_subquery_restriction_clause6534 = new BitSet(new long[]{0x1000000001008000L});
    public static final BitSet FOLLOW_constraint_name_in_subquery_restriction_clause6536 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_sample_key_in_sample_clause6587 = new BitSet(new long[]{0x1000000004000000L});
    public static final BitSet FOLLOW_block_key_in_sample_clause6589 = new BitSet(new long[]{0x0000000004000000L});
    public static final BitSet FOLLOW_LEFT_PAREN_in_sample_clause6601 = new BitSet(new long[]{0x1400000025088C20L,0x2008180030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_expression_in_sample_clause6603 = new BitSet(new long[]{0x4000000000000000L});
    public static final BitSet FOLLOW_RIGHT_PAREN_in_sample_clause6605 = new BitSet(new long[]{0x1000000000000002L});
    public static final BitSet FOLLOW_seed_part_in_sample_clause6615 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_seed_key_in_seed_part6663 = new BitSet(new long[]{0x0000000004000000L});
    public static final BitSet FOLLOW_LEFT_PAREN_in_seed_part6665 = new BitSet(new long[]{0x1400000025088C20L,0x2008180030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_expression_in_seed_part6667 = new BitSet(new long[]{0x4000000000000000L});
    public static final BitSet FOLLOW_RIGHT_PAREN_in_seed_part6669 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_LEFT_PAREN_in_expression_list6713 = new BitSet(new long[]{0x5400000025089C20L,0x2008180030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_expression_in_expression_list6715 = new BitSet(new long[]{0x4000000000001000L});
    public static final BitSet FOLLOW_COMMA_in_expression_list6719 = new BitSet(new long[]{0x1400000025088C20L,0x2008180030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_expression_in_expression_list6721 = new BitSet(new long[]{0x4000000000001000L});
    public static final BitSet FOLLOW_RIGHT_PAREN_in_expression_list6725 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_expression_in_condition6767 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_expression_in_condition_wrapper6787 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_logical_and_expression_in_expression6823 = new BitSet(new long[]{0x0000000000000002L,0x0001000000000000L});
    public static final BitSet FOLLOW_or_key_in_expression6827 = new BitSet(new long[]{0x1400000025088C20L,0x2008180030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_logical_and_expression_in_expression6830 = new BitSet(new long[]{0x0000000000000002L,0x0001000000000000L});
    public static final BitSet FOLLOW_expression_in_expression_wrapper6857 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_negated_expression_in_logical_and_expression6893 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000040L});
    public static final BitSet FOLLOW_and_key_in_logical_and_expression6897 = new BitSet(new long[]{0x1400000025088C20L,0x2008180030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_negated_expression_in_logical_and_expression6900 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000040L});
    public static final BitSet FOLLOW_not_key_in_negated_expression6923 = new BitSet(new long[]{0x1400000025088C20L,0x2008180030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_negated_expression_in_negated_expression6926 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_equality_expression_in_negated_expression6937 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_multiset_expression_in_equality_expression6966 = new BitSet(new long[]{0x0000000000000002L,0x0000020000000000L});
    public static final BitSet FOLLOW_is_key_in_equality_expression6982 = new BitSet(new long[]{0x1000000000000000L,0x0000380000000000L});
    public static final BitSet FOLLOW_not_key_in_equality_expression6985 = new BitSet(new long[]{0x1000000000000000L,0x0000300000000000L});
    public static final BitSet FOLLOW_null_key_in_equality_expression7004 = new BitSet(new long[]{0x0000000000000002L,0x0000020000000000L});
    public static final BitSet FOLLOW_nan_key_in_equality_expression7071 = new BitSet(new long[]{0x0000000000000002L,0x0000020000000000L});
    public static final BitSet FOLLOW_present_key_in_equality_expression7138 = new BitSet(new long[]{0x0000000000000002L,0x0000020000000000L});
    public static final BitSet FOLLOW_infinite_key_in_equality_expression7205 = new BitSet(new long[]{0x0000000000000002L,0x0000020000000000L});
    public static final BitSet FOLLOW_a_key_in_equality_expression7272 = new BitSet(new long[]{0x1000000000000000L});
    public static final BitSet FOLLOW_set_key_in_equality_expression7274 = new BitSet(new long[]{0x0000000000000002L,0x0000020000000000L});
    public static final BitSet FOLLOW_empty_key_in_equality_expression7341 = new BitSet(new long[]{0x0000000000000002L,0x0000020000000000L});
    public static final BitSet FOLLOW_of_key_in_equality_expression7408 = new BitSet(new long[]{0x1000000004000000L});
    public static final BitSet FOLLOW_type_key_in_equality_expression7410 = new BitSet(new long[]{0x0000000004000000L});
    public static final BitSet FOLLOW_LEFT_PAREN_in_equality_expression7413 = new BitSet(new long[]{0x1000000000008000L});
    public static final BitSet FOLLOW_type_spec_in_equality_expression7415 = new BitSet(new long[]{0x4000000000001000L});
    public static final BitSet FOLLOW_COMMA_in_equality_expression7418 = new BitSet(new long[]{0x1000000000008000L});
    public static final BitSet FOLLOW_type_spec_in_equality_expression7420 = new BitSet(new long[]{0x4000000000001000L});
    public static final BitSet FOLLOW_RIGHT_PAREN_in_equality_expression7424 = new BitSet(new long[]{0x0000000000000002L,0x0000020000000000L});
    public static final BitSet FOLLOW_relational_expression_in_multiset_expression7521 = new BitSet(new long[]{0x1000000000000002L});
    public static final BitSet FOLLOW_multiset_type_in_multiset_expression7537 = new BitSet(new long[]{0x1400000025088C20L,0x2008300030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_of_key_in_multiset_expression7539 = new BitSet(new long[]{0x1400000025088C20L,0x2008100030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_concatenation_in_multiset_expression7542 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_member_key_in_multiset_type7587 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_submultiset_key_in_multiset_type7598 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_compound_expression_in_relational_expression7618 = new BitSet(new long[]{0x0000000118640002L});
    public static final BitSet FOLLOW_EQUALS_OP_in_relational_expression7628 = new BitSet(new long[]{0x1400000025088C20L,0x2008100030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_NOT_EQUAL_OP_in_relational_expression7633 = new BitSet(new long[]{0x1400000025088C20L,0x2008100030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_LESS_THAN_OP_in_relational_expression7638 = new BitSet(new long[]{0x1400000025088C20L,0x2008100030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_GREATER_THAN_OP_in_relational_expression7643 = new BitSet(new long[]{0x1400000025088C20L,0x2008100030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_LESS_THAN_OR_EQUALS_OP_in_relational_expression7648 = new BitSet(new long[]{0x1400000025088C20L,0x2008100030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_GREATER_THAN_OR_EQUALS_OP_in_relational_expression7653 = new BitSet(new long[]{0x1400000025088C20L,0x2008100030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_compound_expression_in_relational_expression7658 = new BitSet(new long[]{0x0000000118640002L});
    public static final BitSet FOLLOW_concatenation_in_compound_expression7689 = new BitSet(new long[]{0x1000000000000002L,0x00000C2000001000L});
    public static final BitSet FOLLOW_not_key_in_compound_expression7706 = new BitSet(new long[]{0x1000000000000000L,0x0000042000001000L});
    public static final BitSet FOLLOW_in_key_in_compound_expression7726 = new BitSet(new long[]{0x0000000004000000L});
    public static final BitSet FOLLOW_in_elements_in_compound_expression7728 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_between_key_in_compound_expression7799 = new BitSet(new long[]{0x1400000025088C20L,0x2008100030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_between_elements_in_compound_expression7801 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_like_type_in_compound_expression7872 = new BitSet(new long[]{0x1400000025088C20L,0x2008100030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_concatenation_in_compound_expression7874 = new BitSet(new long[]{0x1000000000000002L});
    public static final BitSet FOLLOW_like_escape_part_in_compound_expression7876 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_like_key_in_like_type7985 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_likec_key_in_like_type7996 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_like2_key_in_like_type8007 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_like4_key_in_like_type8018 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_escape_key_in_like_escape_part8038 = new BitSet(new long[]{0x1400000025088C20L,0x2008100030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_concatenation_in_like_escape_part8040 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_LEFT_PAREN_in_in_elements8084 = new BitSet(new long[]{0x1400000025088C20L,0x2088100030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_subquery_in_in_elements8092 = new BitSet(new long[]{0x4000000000000000L});
    public static final BitSet FOLLOW_concatenation_wrapper_in_in_elements8098 = new BitSet(new long[]{0x4000000000001000L});
    public static final BitSet FOLLOW_COMMA_in_in_elements8101 = new BitSet(new long[]{0x1400000025088C20L,0x2008100030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_concatenation_wrapper_in_in_elements8103 = new BitSet(new long[]{0x4000000000001000L});
    public static final BitSet FOLLOW_RIGHT_PAREN_in_in_elements8109 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_concatenation_in_between_elements8162 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000040L});
    public static final BitSet FOLLOW_and_key_in_between_elements8164 = new BitSet(new long[]{0x1400000025088C20L,0x2008100030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_concatenation_in_between_elements8168 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_additive_expression_in_concatenation8213 = new BitSet(new long[]{0x0000000000004002L});
    public static final BitSet FOLLOW_CONCATENATION_OP_in_concatenation8216 = new BitSet(new long[]{0x1400000025088C20L,0x2008100030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_additive_expression_in_concatenation8219 = new BitSet(new long[]{0x0000000000004002L});
    public static final BitSet FOLLOW_concatenation_in_concatenation_wrapper8241 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_multiply_expression_in_additive_expression8277 = new BitSet(new long[]{0x0400000020000002L});
    public static final BitSet FOLLOW_PLUS_SIGN_in_additive_expression8283 = new BitSet(new long[]{0x1400000025088C20L,0x2008100030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_MINUS_SIGN_in_additive_expression8288 = new BitSet(new long[]{0x1400000025088C20L,0x2008100030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_multiply_expression_in_additive_expression8293 = new BitSet(new long[]{0x0400000020000002L});
    public static final BitSet FOLLOW_datetime_expression_in_multiply_expression8315 = new BitSet(new long[]{0x0000000000000082L,0x0000000000000004L});
    public static final BitSet FOLLOW_ASTERISK_in_multiply_expression8321 = new BitSet(new long[]{0x1400000025088C20L,0x2008100030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_SOLIDUS_in_multiply_expression8326 = new BitSet(new long[]{0x1400000025088C20L,0x2008100030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_datetime_expression_in_multiply_expression8331 = new BitSet(new long[]{0x0000000000000082L,0x0000000000000004L});
    public static final BitSet FOLLOW_model_expression_in_datetime_expression8354 = new BitSet(new long[]{0x1000000000000002L});
    public static final BitSet FOLLOW_at_key_in_datetime_expression8370 = new BitSet(new long[]{0x1000000000000000L});
    public static final BitSet FOLLOW_local_key_in_datetime_expression8373 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_time_key_in_datetime_expression8375 = new BitSet(new long[]{0x1000000000000000L});
    public static final BitSet FOLLOW_zone_key_in_datetime_expression8377 = new BitSet(new long[]{0x1400000025088C20L,0x2008100030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_concatenation_wrapper_in_datetime_expression8379 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_interval_expression_in_datetime_expression8429 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_day_key_in_interval_expression8479 = new BitSet(new long[]{0x0000000004000000L,0x1000000000000000L});
    public static final BitSet FOLLOW_LEFT_PAREN_in_interval_expression8485 = new BitSet(new long[]{0x1400000025088C20L,0x2008100030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_concatenation_wrapper_in_interval_expression8489 = new BitSet(new long[]{0x4000000000000000L});
    public static final BitSet FOLLOW_RIGHT_PAREN_in_interval_expression8491 = new BitSet(new long[]{0x0000000000000000L,0x1000000000000000L});
    public static final BitSet FOLLOW_to_key_in_interval_expression8495 = new BitSet(new long[]{0x1000000000000000L});
    public static final BitSet FOLLOW_second_key_in_interval_expression8497 = new BitSet(new long[]{0x0000000004000002L});
    public static final BitSet FOLLOW_LEFT_PAREN_in_interval_expression8500 = new BitSet(new long[]{0x1400000025088C20L,0x2008100030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_concatenation_wrapper_in_interval_expression8504 = new BitSet(new long[]{0x4000000000000000L});
    public static final BitSet FOLLOW_RIGHT_PAREN_in_interval_expression8506 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_year_key_in_interval_expression8543 = new BitSet(new long[]{0x0000000004000000L,0x1000000000000000L});
    public static final BitSet FOLLOW_LEFT_PAREN_in_interval_expression8546 = new BitSet(new long[]{0x1400000025088C20L,0x2008100030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_concatenation_wrapper_in_interval_expression8548 = new BitSet(new long[]{0x4000000000000000L});
    public static final BitSet FOLLOW_RIGHT_PAREN_in_interval_expression8550 = new BitSet(new long[]{0x0000000000000000L,0x1000000000000000L});
    public static final BitSet FOLLOW_to_key_in_interval_expression8554 = new BitSet(new long[]{0x1000000000000000L});
    public static final BitSet FOLLOW_month_key_in_interval_expression8556 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_keep_expression_in_model_expression8595 = new BitSet(new long[]{0x0000000002000002L});
    public static final BitSet FOLLOW_LEFT_BRACKET_in_model_expression8612 = new BitSet(new long[]{0x1400000025088C20L,0x20081800B0904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_model_expression_element_in_model_expression8614 = new BitSet(new long[]{0x2000000000000000L});
    public static final BitSet FOLLOW_RIGHT_BRACKET_in_model_expression8616 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_any_key_in_model_expression_element8668 = new BitSet(new long[]{0x0000000000001002L});
    public static final BitSet FOLLOW_condition_wrapper_in_model_expression_element8670 = new BitSet(new long[]{0x0000000000001002L});
    public static final BitSet FOLLOW_COMMA_in_model_expression_element8674 = new BitSet(new long[]{0x1400000025088C20L,0x2008180030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_any_key_in_model_expression_element8683 = new BitSet(new long[]{0x0000000000001002L});
    public static final BitSet FOLLOW_condition_wrapper_in_model_expression_element8685 = new BitSet(new long[]{0x0000000000001002L});
    public static final BitSet FOLLOW_single_column_for_loop_in_model_expression_element8699 = new BitSet(new long[]{0x0000000000001002L});
    public static final BitSet FOLLOW_COMMA_in_model_expression_element8702 = new BitSet(new long[]{0x0000000000000000L,0x0000000080000000L});
    public static final BitSet FOLLOW_single_column_for_loop_in_model_expression_element8705 = new BitSet(new long[]{0x0000000000001002L});
    public static final BitSet FOLLOW_multi_column_for_loop_in_model_expression_element8718 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_for_key_in_single_column_for_loop8746 = new BitSet(new long[]{0x1000000001008000L});
    public static final BitSet FOLLOW_column_name_in_single_column_for_loop8748 = new BitSet(new long[]{0x0000000000000000L,0x0000042100000000L});
    public static final BitSet FOLLOW_in_key_in_single_column_for_loop8760 = new BitSet(new long[]{0x0000000004000000L});
    public static final BitSet FOLLOW_expression_list_in_single_column_for_loop8762 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_for_like_part_in_single_column_for_loop8775 = new BitSet(new long[]{0x0000000000000000L,0x0000000100000000L});
    public static final BitSet FOLLOW_from_key_in_single_column_for_loop8778 = new BitSet(new long[]{0x1400000025088C20L,0x2008180030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_expression_in_single_column_for_loop8782 = new BitSet(new long[]{0x0000000000000000L,0x1000000000000000L});
    public static final BitSet FOLLOW_to_key_in_single_column_for_loop8796 = new BitSet(new long[]{0x1400000025088C20L,0x2008180030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_expression_in_single_column_for_loop8800 = new BitSet(new long[]{0x1000000000000000L});
    public static final BitSet FOLLOW_for_increment_decrement_type_in_single_column_for_loop8802 = new BitSet(new long[]{0x1400000025088C20L,0x2008180030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_expression_in_single_column_for_loop8806 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_like_key_in_for_like_part8915 = new BitSet(new long[]{0x1400000025088C20L,0x2008180030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_expression_in_for_like_part8917 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_increment_key_in_for_increment_decrement_type8957 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_decrement_key_in_for_increment_decrement_type8968 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_for_key_in_multi_column_for_loop8988 = new BitSet(new long[]{0x0000000004000000L});
    public static final BitSet FOLLOW_LEFT_PAREN_in_multi_column_for_loop8990 = new BitSet(new long[]{0x1000000001008000L});
    public static final BitSet FOLLOW_column_name_in_multi_column_for_loop8992 = new BitSet(new long[]{0x4000000000001000L});
    public static final BitSet FOLLOW_COMMA_in_multi_column_for_loop8995 = new BitSet(new long[]{0x1000000001008000L});
    public static final BitSet FOLLOW_column_name_in_multi_column_for_loop8997 = new BitSet(new long[]{0x4000000000001000L});
    public static final BitSet FOLLOW_RIGHT_PAREN_in_multi_column_for_loop9001 = new BitSet(new long[]{0x0000000000000000L,0x0000002000000000L});
    public static final BitSet FOLLOW_in_key_in_multi_column_for_loop9003 = new BitSet(new long[]{0x0000000004000000L});
    public static final BitSet FOLLOW_LEFT_PAREN_in_multi_column_for_loop9013 = new BitSet(new long[]{0x0000000004000000L,0x0080000000000000L});
    public static final BitSet FOLLOW_subquery_in_multi_column_for_loop9037 = new BitSet(new long[]{0x4000000000000000L});
    public static final BitSet FOLLOW_LEFT_PAREN_in_multi_column_for_loop9061 = new BitSet(new long[]{0x0000000004000000L});
    public static final BitSet FOLLOW_expression_list_in_multi_column_for_loop9063 = new BitSet(new long[]{0x4000000000001000L});
    public static final BitSet FOLLOW_COMMA_in_multi_column_for_loop9066 = new BitSet(new long[]{0x0000000004000000L});
    public static final BitSet FOLLOW_expression_list_in_multi_column_for_loop9068 = new BitSet(new long[]{0x4000000000001000L});
    public static final BitSet FOLLOW_RIGHT_PAREN_in_multi_column_for_loop9072 = new BitSet(new long[]{0x4000000000000000L});
    public static final BitSet FOLLOW_RIGHT_PAREN_in_multi_column_for_loop9096 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_unary_expression_in_keep_expression9144 = new BitSet(new long[]{0x1000000000000002L});
    public static final BitSet FOLLOW_keep_key_in_keep_expression9155 = new BitSet(new long[]{0x0000000004000000L});
    public static final BitSet FOLLOW_LEFT_PAREN_in_keep_expression9167 = new BitSet(new long[]{0x1000000000000000L});
    public static final BitSet FOLLOW_dense_rank_key_in_keep_expression9183 = new BitSet(new long[]{0x1000000000000000L});
    public static final BitSet FOLLOW_first_key_in_keep_expression9186 = new BitSet(new long[]{0x0000000000000000L,0x0002000000000000L});
    public static final BitSet FOLLOW_last_key_in_keep_expression9188 = new BitSet(new long[]{0x0000000000000000L,0x0002000000000000L});
    public static final BitSet FOLLOW_order_by_clause_in_keep_expression9204 = new BitSet(new long[]{0x4000000000000000L});
    public static final BitSet FOLLOW_RIGHT_PAREN_in_keep_expression9214 = new BitSet(new long[]{0x1000000000000002L});
    public static final BitSet FOLLOW_over_clause_in_keep_expression9217 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_MINUS_SIGN_in_unary_expression9244 = new BitSet(new long[]{0x1400000025088C20L,0x2008100030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_unary_expression_in_unary_expression9246 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_PLUS_SIGN_in_unary_expression9266 = new BitSet(new long[]{0x1400000025088C20L,0x2008100030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_unary_expression_in_unary_expression9268 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_prior_key_in_unary_expression9288 = new BitSet(new long[]{0x1400000025088C20L,0x2008100030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_unary_expression_in_unary_expression9291 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_new_key_in_unary_expression9305 = new BitSet(new long[]{0x1400000025088C20L,0x2008100030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_unary_expression_in_unary_expression9308 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_distinct_key_in_unary_expression9319 = new BitSet(new long[]{0x1400000025088C20L,0x2008100030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_unary_expression_in_unary_expression9322 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_all_key_in_unary_expression9333 = new BitSet(new long[]{0x1400000025088C20L,0x2008100030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_unary_expression_in_unary_expression9336 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_case_statement_in_unary_expression9349 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_quantified_expression_in_unary_expression9361 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_standard_function_in_unary_expression9372 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_atom_in_unary_expression9391 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_searched_case_statement_in_case_statement9438 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_simple_case_statement_in_case_statement9449 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_label_name_in_simple_case_statement9471 = new BitSet(new long[]{0x0000000000000000L,0x0000000000004000L});
    public static final BitSet FOLLOW_case_key_in_simple_case_statement9476 = new BitSet(new long[]{0x1000000005088C20L,0x2000100020100000L,0x0000000000000080L});
    public static final BitSet FOLLOW_atom_in_simple_case_statement9478 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000008L});
    public static final BitSet FOLLOW_simple_case_when_part_in_simple_case_statement9488 = new BitSet(new long[]{0x0000000000000000L,0x0000000006000000L,0x0000000000000008L});
    public static final BitSet FOLLOW_case_else_part_in_simple_case_statement9500 = new BitSet(new long[]{0x0000000000000000L,0x0000000004000000L});
    public static final BitSet FOLLOW_end_key_in_simple_case_statement9511 = new BitSet(new long[]{0x1000000000008002L,0x0000000000004000L});
    public static final BitSet FOLLOW_case_key_in_simple_case_statement9513 = new BitSet(new long[]{0x1000000000008002L});
    public static final BitSet FOLLOW_label_name_in_simple_case_statement9516 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_when_key_in_simple_case_when_part9569 = new BitSet(new long[]{0x1400000025088C20L,0x2008180030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_expression_wrapper_in_simple_case_when_part9574 = new BitSet(new long[]{0x0000000000000000L,0x0800000000000000L});
    public static final BitSet FOLLOW_then_key_in_simple_case_when_part9576 = new BitSet(new long[]{0x1400000025088C20L,0x2088184030B04090L,0x00000000000000A1L});
    public static final BitSet FOLLOW_seq_of_statements_in_simple_case_when_part9582 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_expression_wrapper_in_simple_case_when_part9588 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_label_name_in_searched_case_statement9609 = new BitSet(new long[]{0x0000000000000000L,0x0000000000004000L});
    public static final BitSet FOLLOW_case_key_in_searched_case_statement9614 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000008L});
    public static final BitSet FOLLOW_searched_case_when_part_in_searched_case_statement9624 = new BitSet(new long[]{0x0000000000000000L,0x0000000006000000L,0x0000000000000008L});
    public static final BitSet FOLLOW_case_else_part_in_searched_case_statement9635 = new BitSet(new long[]{0x0000000000000000L,0x0000000004000000L});
    public static final BitSet FOLLOW_end_key_in_searched_case_statement9646 = new BitSet(new long[]{0x1000000000008002L,0x0000000000004000L});
    public static final BitSet FOLLOW_case_key_in_searched_case_statement9648 = new BitSet(new long[]{0x1000000000008002L});
    public static final BitSet FOLLOW_label_name_in_searched_case_statement9651 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_when_key_in_searched_case_when_part9697 = new BitSet(new long[]{0x1400000025088C20L,0x2008180030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_condition_wrapper_in_searched_case_when_part9700 = new BitSet(new long[]{0x0000000000000000L,0x0800000000000000L});
    public static final BitSet FOLLOW_then_key_in_searched_case_when_part9702 = new BitSet(new long[]{0x1400000025088C20L,0x2088184030B04090L,0x00000000000000A1L});
    public static final BitSet FOLLOW_seq_of_statements_in_searched_case_when_part9708 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_expression_wrapper_in_searched_case_when_part9712 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_else_key_in_case_else_part9733 = new BitSet(new long[]{0x1400000025088C20L,0x2088184030B04090L,0x00000000000000A1L});
    public static final BitSet FOLLOW_seq_of_statements_in_case_else_part9739 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_expression_wrapper_in_case_else_part9743 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_constant_in_atom9765 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_general_element_in_atom9776 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_LEFT_PAREN_in_atom9787 = new BitSet(new long[]{0x1400000025088C20L,0x2088180030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_subquery_in_atom9796 = new BitSet(new long[]{0x4000000000000000L});
    public static final BitSet FOLLOW_expression_or_vector_in_atom9798 = new BitSet(new long[]{0x4000000000000000L});
    public static final BitSet FOLLOW_RIGHT_PAREN_in_atom9801 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_expression_in_expression_or_vector9830 = new BitSet(new long[]{0x0000000000001002L});
    public static final BitSet FOLLOW_vector_expr_in_expression_or_vector9833 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_COMMA_in_vector_expr9893 = new BitSet(new long[]{0x1400000025088C20L,0x2008180030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_expression_in_vector_expr9895 = new BitSet(new long[]{0x0000000000001002L});
    public static final BitSet FOLLOW_COMMA_in_vector_expr9898 = new BitSet(new long[]{0x1400000025088C20L,0x2008180030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_expression_in_vector_expr9900 = new BitSet(new long[]{0x0000000000001002L});
    public static final BitSet FOLLOW_some_key_in_quantified_expression9941 = new BitSet(new long[]{0x0000000004000000L});
    public static final BitSet FOLLOW_exists_key_in_quantified_expression9946 = new BitSet(new long[]{0x0000000004000000L});
    public static final BitSet FOLLOW_all_key_in_quantified_expression9951 = new BitSet(new long[]{0x0000000004000000L});
    public static final BitSet FOLLOW_any_key_in_quantified_expression9956 = new BitSet(new long[]{0x0000000004000000L});
    public static final BitSet FOLLOW_LEFT_PAREN_in_quantified_expression9970 = new BitSet(new long[]{0x1400000025088C20L,0x2008180030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_expression_wrapper_in_quantified_expression9973 = new BitSet(new long[]{0x4000000000000000L});
    public static final BitSet FOLLOW_RIGHT_PAREN_in_quantified_expression9975 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_stantard_function_enabling_over_in_standard_function9996 = new BitSet(new long[]{0x0000000004000000L});
    public static final BitSet FOLLOW_function_argument_in_standard_function9999 = new BitSet(new long[]{0x1000000000000002L});
    public static final BitSet FOLLOW_over_clause_in_standard_function10001 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_stantard_function_enabling_using_in_standard_function10013 = new BitSet(new long[]{0x0000000004000000L});
    public static final BitSet FOLLOW_function_argument_in_standard_function10016 = new BitSet(new long[]{0x0000002000000002L});
    public static final BitSet FOLLOW_using_clause_in_standard_function10018 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_count_key_in_standard_function10030 = new BitSet(new long[]{0x0000000004000000L});
    public static final BitSet FOLLOW_LEFT_PAREN_in_standard_function10045 = new BitSet(new long[]{0x1400000025088CA0L,0x2008100030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_ASTERISK_in_standard_function10066 = new BitSet(new long[]{0x4000000000000000L});
    public static final BitSet FOLLOW_concatenation_wrapper_in_standard_function10070 = new BitSet(new long[]{0x4000000000000000L});
    public static final BitSet FOLLOW_RIGHT_PAREN_in_standard_function10087 = new BitSet(new long[]{0x1000000000000002L});
    public static final BitSet FOLLOW_over_clause_in_standard_function10090 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_cast_key_in_standard_function10103 = new BitSet(new long[]{0x0000000004000000L});
    public static final BitSet FOLLOW_xmlcast_key_in_standard_function10106 = new BitSet(new long[]{0x0000000004000000L});
    public static final BitSet FOLLOW_LEFT_PAREN_in_standard_function10123 = new BitSet(new long[]{0x1400000025088C20L,0x2008100030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_multiset_key_in_standard_function10143 = new BitSet(new long[]{0x0000000004000000L});
    public static final BitSet FOLLOW_LEFT_PAREN_in_standard_function10146 = new BitSet(new long[]{0x0000000004000000L,0x0080000000000000L});
    public static final BitSet FOLLOW_subquery_in_standard_function10149 = new BitSet(new long[]{0x4000000000000000L});
    public static final BitSet FOLLOW_RIGHT_PAREN_in_standard_function10151 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000100L});
    public static final BitSet FOLLOW_concatenation_wrapper_in_standard_function10153 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000100L});
    public static final BitSet FOLLOW_as_key_in_standard_function10156 = new BitSet(new long[]{0x1000000000008000L});
    public static final BitSet FOLLOW_type_spec_in_standard_function10159 = new BitSet(new long[]{0x4000000000000000L});
    public static final BitSet FOLLOW_RIGHT_PAREN_in_standard_function10174 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_chr_key_in_standard_function10186 = new BitSet(new long[]{0x0000000004000000L});
    public static final BitSet FOLLOW_LEFT_PAREN_in_standard_function10201 = new BitSet(new long[]{0x1400000025088C20L,0x2008100030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_concatenation_wrapper_in_standard_function10221 = new BitSet(new long[]{0x0000002000000000L});
    public static final BitSet FOLLOW_using_key_in_standard_function10223 = new BitSet(new long[]{0x1000000000000000L});
    public static final BitSet FOLLOW_nchar_cs_key_in_standard_function10226 = new BitSet(new long[]{0x4000000000000000L});
    public static final BitSet FOLLOW_RIGHT_PAREN_in_standard_function10241 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_collect_key_in_standard_function10253 = new BitSet(new long[]{0x0000000004000000L});
    public static final BitSet FOLLOW_LEFT_PAREN_in_standard_function10268 = new BitSet(new long[]{0x1000000001008000L,0x8000000000800000L});
    public static final BitSet FOLLOW_distinct_key_in_standard_function10289 = new BitSet(new long[]{0x1000000001008000L});
    public static final BitSet FOLLOW_unique_key_in_standard_function10291 = new BitSet(new long[]{0x1000000001008000L});
    public static final BitSet FOLLOW_column_name_in_standard_function10295 = new BitSet(new long[]{0x4000000000000000L,0x0002000000000000L});
    public static final BitSet FOLLOW_collect_order_by_part_in_standard_function10297 = new BitSet(new long[]{0x4000000000000000L});
    public static final BitSet FOLLOW_RIGHT_PAREN_in_standard_function10312 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_stantard_function_enabling_within_or_over_in_standard_function10324 = new BitSet(new long[]{0x0000000004000000L});
    public static final BitSet FOLLOW_function_argument_in_standard_function10340 = new BitSet(new long[]{0x1000000000000000L});
    public static final BitSet FOLLOW_within_or_over_part_in_standard_function10342 = new BitSet(new long[]{0x1000000000000002L});
    public static final BitSet FOLLOW_decompose_key_in_standard_function10354 = new BitSet(new long[]{0x0000000004000000L});
    public static final BitSet FOLLOW_LEFT_PAREN_in_standard_function10369 = new BitSet(new long[]{0x1400000025088C20L,0x2008100030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_concatenation_wrapper_in_standard_function10389 = new BitSet(new long[]{0x5000000000000000L});
    public static final BitSet FOLLOW_canonical_key_in_standard_function10392 = new BitSet(new long[]{0x4000000000000000L});
    public static final BitSet FOLLOW_compatibility_key_in_standard_function10394 = new BitSet(new long[]{0x4000000000000000L});
    public static final BitSet FOLLOW_RIGHT_PAREN_in_standard_function10411 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_extract_key_in_standard_function10423 = new BitSet(new long[]{0x0000000004000000L});
    public static final BitSet FOLLOW_LEFT_PAREN_in_standard_function10438 = new BitSet(new long[]{0x1000000000000000L});
    public static final BitSet FOLLOW_REGULAR_ID_in_standard_function10457 = new BitSet(new long[]{0x0000000000000000L,0x0000000100000000L});
    public static final BitSet FOLLOW_from_key_in_standard_function10459 = new BitSet(new long[]{0x1400000025088C20L,0x2008100030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_concatenation_wrapper_in_standard_function10462 = new BitSet(new long[]{0x4000000000000000L});
    public static final BitSet FOLLOW_RIGHT_PAREN_in_standard_function10477 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_first_value_key_in_standard_function10490 = new BitSet(new long[]{0x0000000004000000L});
    public static final BitSet FOLLOW_last_value_key_in_standard_function10493 = new BitSet(new long[]{0x0000000004000000L});
    public static final BitSet FOLLOW_LEFT_PAREN_in_standard_function10510 = new BitSet(new long[]{0x1400000025088C20L,0x2008100030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_concatenation_wrapper_in_standard_function10529 = new BitSet(new long[]{0x5000000000000000L});
    public static final BitSet FOLLOW_ignore_key_in_standard_function10532 = new BitSet(new long[]{0x1000000000000000L});
    public static final BitSet FOLLOW_nulls_key_in_standard_function10535 = new BitSet(new long[]{0x4000000000000000L});
    public static final BitSet FOLLOW_RIGHT_PAREN_in_standard_function10552 = new BitSet(new long[]{0x1000000000000000L});
    public static final BitSet FOLLOW_over_clause_in_standard_function10555 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_stantard_function_pedictions_in_standard_function10566 = new BitSet(new long[]{0x0000000004000000L});
    public static final BitSet FOLLOW_LEFT_PAREN_in_standard_function10581 = new BitSet(new long[]{0x1400000025088C20L,0x2008180030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_expression_wrapper_in_standard_function10600 = new BitSet(new long[]{0x5000002000001000L});
    public static final BitSet FOLLOW_COMMA_in_standard_function10603 = new BitSet(new long[]{0x1400000025088C20L,0x2008180030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_expression_wrapper_in_standard_function10605 = new BitSet(new long[]{0x5000002000001000L});
    public static final BitSet FOLLOW_cost_matrix_clause_in_standard_function10609 = new BitSet(new long[]{0x4000002000000000L});
    public static final BitSet FOLLOW_using_clause_in_standard_function10612 = new BitSet(new long[]{0x4000000000000000L});
    public static final BitSet FOLLOW_RIGHT_PAREN_in_standard_function10628 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_translate_key_in_standard_function10640 = new BitSet(new long[]{0x0000000004000000L});
    public static final BitSet FOLLOW_LEFT_PAREN_in_standard_function10655 = new BitSet(new long[]{0x1400000025088C20L,0x2008180030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_expression_wrapper_in_standard_function10675 = new BitSet(new long[]{0x4000002000001000L});
    public static final BitSet FOLLOW_using_key_in_standard_function10678 = new BitSet(new long[]{0x1000000000000000L});
    public static final BitSet FOLLOW_char_cs_key_in_standard_function10682 = new BitSet(new long[]{0x4000000000001000L});
    public static final BitSet FOLLOW_nchar_cs_key_in_standard_function10684 = new BitSet(new long[]{0x4000000000001000L});
    public static final BitSet FOLLOW_COMMA_in_standard_function10711 = new BitSet(new long[]{0x1400000025088C20L,0x2008180030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_expression_wrapper_in_standard_function10713 = new BitSet(new long[]{0x4000000000001000L});
    public static final BitSet FOLLOW_RIGHT_PAREN_in_standard_function10730 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_treat_key_in_standard_function10742 = new BitSet(new long[]{0x0000000004000000L});
    public static final BitSet FOLLOW_LEFT_PAREN_in_standard_function10757 = new BitSet(new long[]{0x1400000025088C20L,0x2008180030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_expression_wrapper_in_standard_function10776 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000100L});
    public static final BitSet FOLLOW_as_key_in_standard_function10778 = new BitSet(new long[]{0x1000000000008000L});
    public static final BitSet FOLLOW_ref_key_in_standard_function10781 = new BitSet(new long[]{0x1000000000008000L});
    public static final BitSet FOLLOW_type_spec_in_standard_function10784 = new BitSet(new long[]{0x4000000000000000L});
    public static final BitSet FOLLOW_RIGHT_PAREN_in_standard_function10799 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_trim_key_in_standard_function10811 = new BitSet(new long[]{0x0000000004000000L});
    public static final BitSet FOLLOW_LEFT_PAREN_in_standard_function10826 = new BitSet(new long[]{0x1400000025088C20L,0x2008100030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_leading_key_in_standard_function10848 = new BitSet(new long[]{0x1400000025088C20L,0x2008100030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_trailing_key_in_standard_function10850 = new BitSet(new long[]{0x1400000025088C20L,0x2008100030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_both_key_in_standard_function10852 = new BitSet(new long[]{0x1400000025088C20L,0x2008100030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_concatenation_wrapper_in_standard_function10856 = new BitSet(new long[]{0x0000000000000000L,0x0000000100000000L});
    public static final BitSet FOLLOW_from_key_in_standard_function10858 = new BitSet(new long[]{0x1400000025088C20L,0x2008100030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_concatenation_wrapper_in_standard_function10863 = new BitSet(new long[]{0x4000000000000000L});
    public static final BitSet FOLLOW_RIGHT_PAREN_in_standard_function10878 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_xmlagg_key_in_standard_function10890 = new BitSet(new long[]{0x0000000004000000L});
    public static final BitSet FOLLOW_LEFT_PAREN_in_standard_function10905 = new BitSet(new long[]{0x1400000025088C20L,0x2008180030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_expression_wrapper_in_standard_function10925 = new BitSet(new long[]{0x4000000000000000L,0x0002000000000000L});
    public static final BitSet FOLLOW_order_by_clause_in_standard_function10927 = new BitSet(new long[]{0x4000000000000000L});
    public static final BitSet FOLLOW_RIGHT_PAREN_in_standard_function10943 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_xmlcolattval_key_in_standard_function10956 = new BitSet(new long[]{0x0000000004000000L});
    public static final BitSet FOLLOW_xmlforest_key_in_standard_function10959 = new BitSet(new long[]{0x0000000004000000L});
    public static final BitSet FOLLOW_LEFT_PAREN_in_standard_function10976 = new BitSet(new long[]{0x1400000025088C20L,0x2008180030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_xml_multiuse_expression_element_in_standard_function10995 = new BitSet(new long[]{0x4000000000001000L});
    public static final BitSet FOLLOW_COMMA_in_standard_function10998 = new BitSet(new long[]{0x1400000025088C20L,0x2008180030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_xml_multiuse_expression_element_in_standard_function11001 = new BitSet(new long[]{0x4000000000001000L});
    public static final BitSet FOLLOW_RIGHT_PAREN_in_standard_function11017 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_xmlelement_key_in_standard_function11029 = new BitSet(new long[]{0x0000000004000000L});
    public static final BitSet FOLLOW_LEFT_PAREN_in_standard_function11044 = new BitSet(new long[]{0x1400000025088C20L,0x2008180030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_entityescaping_key_in_standard_function11064 = new BitSet(new long[]{0x1400000025088C20L,0x2008180030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_noentityescaping_key_in_standard_function11066 = new BitSet(new long[]{0x1400000025088C20L,0x2008180030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_name_key_in_standard_function11087 = new BitSet(new long[]{0x1400000025088C20L,0x2008180030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_evalname_key_in_standard_function11089 = new BitSet(new long[]{0x1400000025088C20L,0x2008180030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_expression_wrapper_in_standard_function11093 = new BitSet(new long[]{0x4000000000001000L});
    public static final BitSet FOLLOW_COMMA_in_standard_function11114 = new BitSet(new long[]{0x1000000000000000L});
    public static final BitSet FOLLOW_xml_attributes_clause_in_standard_function11117 = new BitSet(new long[]{0x4000000000001000L});
    public static final BitSet FOLLOW_COMMA_in_standard_function11138 = new BitSet(new long[]{0x1400000025088C20L,0x2008180030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_expression_wrapper_in_standard_function11141 = new BitSet(new long[]{0x5000000001009400L,0x0000000000000100L});
    public static final BitSet FOLLOW_alias_in_standard_function11143 = new BitSet(new long[]{0x4000000000001000L});
    public static final BitSet FOLLOW_RIGHT_PAREN_in_standard_function11160 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_xmlexists_key_in_standard_function11172 = new BitSet(new long[]{0x0000000004000000L});
    public static final BitSet FOLLOW_LEFT_PAREN_in_standard_function11187 = new BitSet(new long[]{0x1400000025088C20L,0x2008180030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_expression_wrapper_in_standard_function11206 = new BitSet(new long[]{0x5000000000000000L});
    public static final BitSet FOLLOW_xml_passing_clause_in_standard_function11224 = new BitSet(new long[]{0x4000000000000000L});
    public static final BitSet FOLLOW_RIGHT_PAREN_in_standard_function11239 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_xmlparse_key_in_standard_function11251 = new BitSet(new long[]{0x0000000004000000L});
    public static final BitSet FOLLOW_LEFT_PAREN_in_standard_function11266 = new BitSet(new long[]{0x1000000000000000L});
    public static final BitSet FOLLOW_document_key_in_standard_function11287 = new BitSet(new long[]{0x1400000025088C20L,0x2008100030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_content_key_in_standard_function11289 = new BitSet(new long[]{0x1400000025088C20L,0x2008100030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_concatenation_wrapper_in_standard_function11292 = new BitSet(new long[]{0x5000000000000000L});
    public static final BitSet FOLLOW_wellformed_key_in_standard_function11294 = new BitSet(new long[]{0x4000000000000000L});
    public static final BitSet FOLLOW_RIGHT_PAREN_in_standard_function11309 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_xmlpi_key_in_standard_function11321 = new BitSet(new long[]{0x0000000004000000L});
    public static final BitSet FOLLOW_LEFT_PAREN_in_standard_function11336 = new BitSet(new long[]{0x1000000000000000L});
    public static final BitSet FOLLOW_name_key_in_standard_function11361 = new BitSet(new long[]{0x1000000001008000L});
    public static final BitSet FOLLOW_id_in_standard_function11363 = new BitSet(new long[]{0x4000000000001000L});
    public static final BitSet FOLLOW_evalname_key_in_standard_function11386 = new BitSet(new long[]{0x1400000025088C20L,0x2008100030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_concatenation_wrapper_in_standard_function11388 = new BitSet(new long[]{0x4000000000001000L});
    public static final BitSet FOLLOW_COMMA_in_standard_function11425 = new BitSet(new long[]{0x1400000025088C20L,0x2008100030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_concatenation_wrapper_in_standard_function11428 = new BitSet(new long[]{0x4000000000000000L});
    public static final BitSet FOLLOW_RIGHT_PAREN_in_standard_function11444 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_xmlquery_key_in_standard_function11456 = new BitSet(new long[]{0x0000000004000000L});
    public static final BitSet FOLLOW_LEFT_PAREN_in_standard_function11471 = new BitSet(new long[]{0x1400000025088C20L,0x2008100030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_concatenation_wrapper_in_standard_function11491 = new BitSet(new long[]{0x1000000000000000L});
    public static final BitSet FOLLOW_xml_passing_clause_in_standard_function11493 = new BitSet(new long[]{0x1000000000000000L});
    public static final BitSet FOLLOW_returning_key_in_standard_function11512 = new BitSet(new long[]{0x1000000000000000L});
    public static final BitSet FOLLOW_content_key_in_standard_function11515 = new BitSet(new long[]{0x4000000000000000L,0x0000100000000000L});
    public static final BitSet FOLLOW_null_key_in_standard_function11519 = new BitSet(new long[]{0x0000000000000000L,0x0000400000000000L});
    public static final BitSet FOLLOW_on_key_in_standard_function11521 = new BitSet(new long[]{0x1000000000000000L});
    public static final BitSet FOLLOW_empty_key_in_standard_function11524 = new BitSet(new long[]{0x4000000000000000L});
    public static final BitSet FOLLOW_RIGHT_PAREN_in_standard_function11541 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_xmlroot_key_in_standard_function11553 = new BitSet(new long[]{0x0000000004000000L});
    public static final BitSet FOLLOW_LEFT_PAREN_in_standard_function11568 = new BitSet(new long[]{0x1400000025088C20L,0x2008100030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_concatenation_wrapper_in_standard_function11587 = new BitSet(new long[]{0x1000000000000000L});
    public static final BitSet FOLLOW_xmlroot_param_version_part_in_standard_function11609 = new BitSet(new long[]{0x4000000000001000L});
    public static final BitSet FOLLOW_COMMA_in_standard_function11632 = new BitSet(new long[]{0x1000000000000000L});
    public static final BitSet FOLLOW_xmlroot_param_standalone_part_in_standard_function11635 = new BitSet(new long[]{0x4000000000000000L});
    public static final BitSet FOLLOW_RIGHT_PAREN_in_standard_function11651 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_xmlserialize_key_in_standard_function11663 = new BitSet(new long[]{0x0000000004000000L});
    public static final BitSet FOLLOW_LEFT_PAREN_in_standard_function11678 = new BitSet(new long[]{0x1000000000000000L});
    public static final BitSet FOLLOW_document_key_in_standard_function11698 = new BitSet(new long[]{0x1400000025088C20L,0x2008100030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_content_key_in_standard_function11700 = new BitSet(new long[]{0x1400000025088C20L,0x2008100030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_concatenation_wrapper_in_standard_function11719 = new BitSet(new long[]{0x5000000000000000L,0x0000000000000100L});
    public static final BitSet FOLLOW_as_key_in_standard_function11722 = new BitSet(new long[]{0x1000000000008000L});
    public static final BitSet FOLLOW_type_spec_in_standard_function11725 = new BitSet(new long[]{0x5000000000000000L});
    public static final BitSet FOLLOW_xmlserialize_param_enconding_part_in_standard_function11745 = new BitSet(new long[]{0x5000000000000000L});
    public static final BitSet FOLLOW_xmlserialize_param_version_part_in_standard_function11764 = new BitSet(new long[]{0x5000000000000000L});
    public static final BitSet FOLLOW_xmlserialize_param_ident_part_in_standard_function11783 = new BitSet(new long[]{0x5000000000000000L});
    public static final BitSet FOLLOW_hide_key_in_standard_function11804 = new BitSet(new long[]{0x1000000000000000L});
    public static final BitSet FOLLOW_show_key_in_standard_function11806 = new BitSet(new long[]{0x1000000000000000L});
    public static final BitSet FOLLOW_defaults_key_in_standard_function11809 = new BitSet(new long[]{0x4000000000000000L});
    public static final BitSet FOLLOW_RIGHT_PAREN_in_standard_function11825 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_xmltable_key_in_standard_function11837 = new BitSet(new long[]{0x0000000004000000L});
    public static final BitSet FOLLOW_LEFT_PAREN_in_standard_function11852 = new BitSet(new long[]{0x1400000025088C20L,0x2008100030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_xml_namespaces_clause_in_standard_function11871 = new BitSet(new long[]{0x1400000025088C20L,0x2008100030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_concatenation_wrapper_in_standard_function11890 = new BitSet(new long[]{0x5000010000000000L});
    public static final BitSet FOLLOW_xml_passing_clause_in_standard_function11908 = new BitSet(new long[]{0x4000010000000000L});
    public static final BitSet FOLLOW_columns_key_in_standard_function11928 = new BitSet(new long[]{0x1000000001008400L});
    public static final BitSet FOLLOW_xml_table_column_in_standard_function11931 = new BitSet(new long[]{0x0000000000001000L});
    public static final BitSet FOLLOW_COMMA_in_standard_function11934 = new BitSet(new long[]{0x1000000001008400L});
    public static final BitSet FOLLOW_xml_table_column_in_standard_function11937 = new BitSet(new long[]{0x4000000000000000L});
    public static final BitSet FOLLOW_RIGHT_PAREN_in_standard_function11954 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_REGULAR_ID_in_stantard_function_enabling_over11978 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_REGULAR_ID_in_stantard_function_enabling_using12006 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_REGULAR_ID_in_stantard_function_enabling_within_or_over12034 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_REGULAR_ID_in_stantard_function_pedictions12062 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_over_key_in_over_clause12087 = new BitSet(new long[]{0x0000000004000000L});
    public static final BitSet FOLLOW_LEFT_PAREN_in_over_clause12098 = new BitSet(new long[]{0x5000000000000000L,0x0002000000000000L});
    public static final BitSet FOLLOW_query_partition_clause_in_over_clause12113 = new BitSet(new long[]{0x4000000000000000L,0x0002000000000000L});
    public static final BitSet FOLLOW_order_by_clause_in_over_clause12129 = new BitSet(new long[]{0x5000000000000000L});
    public static final BitSet FOLLOW_windowing_clause_in_over_clause12131 = new BitSet(new long[]{0x4000000000000000L});
    public static final BitSet FOLLOW_RIGHT_PAREN_in_over_clause12144 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_windowing_type_in_windowing_clause12173 = new BitSet(new long[]{0x1400000025088C20L,0x2008100030945090L,0x0000000000000080L});
    public static final BitSet FOLLOW_between_key_in_windowing_clause12184 = new BitSet(new long[]{0x1400000025088C20L,0x2008100030944090L,0x0000000000000080L});
    public static final BitSet FOLLOW_windowing_elements_in_windowing_clause12186 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000040L});
    public static final BitSet FOLLOW_and_key_in_windowing_clause12188 = new BitSet(new long[]{0x1400000025088C20L,0x2008100030944090L,0x0000000000000080L});
    public static final BitSet FOLLOW_windowing_elements_in_windowing_clause12190 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_windowing_elements_in_windowing_clause12203 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_rows_key_in_windowing_type12262 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_range_key_in_windowing_type12273 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_unbounded_key_in_windowing_elements12293 = new BitSet(new long[]{0x1000000000000000L});
    public static final BitSet FOLLOW_preceding_key_in_windowing_elements12296 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_current_key_in_windowing_elements12307 = new BitSet(new long[]{0x1000000000000000L});
    public static final BitSet FOLLOW_row_key_in_windowing_elements12310 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_concatenation_wrapper_in_windowing_elements12321 = new BitSet(new long[]{0x1000000000000000L});
    public static final BitSet FOLLOW_preceding_key_in_windowing_elements12324 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_following_key_in_windowing_elements12327 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_using_key_in_using_clause12349 = new BitSet(new long[]{0x1400000025088CA0L,0x2008182030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_ASTERISK_in_using_clause12361 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_using_element_in_using_clause12372 = new BitSet(new long[]{0x0000000000001002L});
    public static final BitSet FOLLOW_COMMA_in_using_clause12375 = new BitSet(new long[]{0x1400000025088C20L,0x2008182030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_using_element_in_using_clause12378 = new BitSet(new long[]{0x0000000000001002L});
    public static final BitSet FOLLOW_in_key_in_using_element12407 = new BitSet(new long[]{0x1400000025088C20L,0x2008180030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_out_key_in_using_element12409 = new BitSet(new long[]{0x1400000025088C20L,0x2008180030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_out_key_in_using_element12412 = new BitSet(new long[]{0x1400000025088C20L,0x2008180030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_select_list_elements_in_using_element12416 = new BitSet(new long[]{0x1000000001008402L,0x0000000000000100L});
    public static final BitSet FOLLOW_alias_in_using_element12418 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_order_key_in_collect_order_by_part12464 = new BitSet(new long[]{0x0000000000000000L,0x0000000000002000L});
    public static final BitSet FOLLOW_by_key_in_collect_order_by_part12467 = new BitSet(new long[]{0x1400000025088C20L,0x2008100030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_concatenation_wrapper_in_collect_order_by_part12470 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_within_key_in_within_or_over_part12490 = new BitSet(new long[]{0x0000000000000000L,0x0000000800000000L});
    public static final BitSet FOLLOW_group_key_in_within_or_over_part12493 = new BitSet(new long[]{0x0000000004000000L});
    public static final BitSet FOLLOW_LEFT_PAREN_in_within_or_over_part12496 = new BitSet(new long[]{0x0000000000000000L,0x0002000000000000L});
    public static final BitSet FOLLOW_order_by_clause_in_within_or_over_part12499 = new BitSet(new long[]{0x4000000000000000L});
    public static final BitSet FOLLOW_RIGHT_PAREN_in_within_or_over_part12501 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_over_clause_in_within_or_over_part12513 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_cost_key_in_cost_matrix_clause12533 = new BitSet(new long[]{0x0000001004000000L});
    public static final BitSet FOLLOW_model_key_in_cost_matrix_clause12545 = new BitSet(new long[]{0x1000000000000002L});
    public static final BitSet FOLLOW_auto_key_in_cost_matrix_clause12547 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_LEFT_PAREN_in_cost_matrix_clause12559 = new BitSet(new long[]{0x1000000001008000L});
    public static final BitSet FOLLOW_cost_class_name_in_cost_matrix_clause12562 = new BitSet(new long[]{0x4000000000001000L});
    public static final BitSet FOLLOW_COMMA_in_cost_matrix_clause12565 = new BitSet(new long[]{0x1000000001008000L});
    public static final BitSet FOLLOW_cost_class_name_in_cost_matrix_clause12568 = new BitSet(new long[]{0x4000000000001000L});
    public static final BitSet FOLLOW_RIGHT_PAREN_in_cost_matrix_clause12572 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000002L});
    public static final BitSet FOLLOW_values_key_in_cost_matrix_clause12575 = new BitSet(new long[]{0x0000000004000000L});
    public static final BitSet FOLLOW_expression_list_in_cost_matrix_clause12591 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_passing_key_in_xml_passing_clause12617 = new BitSet(new long[]{0x1400000025088C20L,0x2008180030906090L,0x0000000000000080L});
    public static final BitSet FOLLOW_by_key_in_xml_passing_clause12621 = new BitSet(new long[]{0x1000000000000000L});
    public static final BitSet FOLLOW_value_key_in_xml_passing_clause12624 = new BitSet(new long[]{0x1400000025088C20L,0x2008180030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_expression_wrapper_in_xml_passing_clause12640 = new BitSet(new long[]{0x1000000001009400L,0x0000000000000100L});
    public static final BitSet FOLLOW_alias_in_xml_passing_clause12642 = new BitSet(new long[]{0x0000000000001000L});
    public static final BitSet FOLLOW_COMMA_in_xml_passing_clause12646 = new BitSet(new long[]{0x1400000025088C20L,0x2008180030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_expression_wrapper_in_xml_passing_clause12649 = new BitSet(new long[]{0x1000000001008402L,0x0000000000000100L});
    public static final BitSet FOLLOW_alias_in_xml_passing_clause12651 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_xmlattributes_key_in_xml_attributes_clause12673 = new BitSet(new long[]{0x0000000004000000L});
    public static final BitSet FOLLOW_LEFT_PAREN_in_xml_attributes_clause12684 = new BitSet(new long[]{0x1400000025088C20L,0x2008180030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_entityescaping_key_in_xml_attributes_clause12700 = new BitSet(new long[]{0x1400000025088C20L,0x2008180030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_noentityescaping_key_in_xml_attributes_clause12702 = new BitSet(new long[]{0x1400000025088C20L,0x2008180030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_schemacheck_key_in_xml_attributes_clause12719 = new BitSet(new long[]{0x1400000025088C20L,0x2008180030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_noschemacheck_key_in_xml_attributes_clause12721 = new BitSet(new long[]{0x1400000025088C20L,0x2008180030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_xml_multiuse_expression_element_in_xml_attributes_clause12737 = new BitSet(new long[]{0x4000000000001000L});
    public static final BitSet FOLLOW_COMMA_in_xml_attributes_clause12740 = new BitSet(new long[]{0x1400000025088C20L,0x2008180030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_xml_multiuse_expression_element_in_xml_attributes_clause12743 = new BitSet(new long[]{0x4000000000001000L});
    public static final BitSet FOLLOW_RIGHT_PAREN_in_xml_attributes_clause12755 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_xmlnamespaces_key_in_xml_namespaces_clause12776 = new BitSet(new long[]{0x0000000004000000L});
    public static final BitSet FOLLOW_LEFT_PAREN_in_xml_namespaces_clause12787 = new BitSet(new long[]{0x5400000025089C20L,0x2008100030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_concatenation_wrapper_in_xml_namespaces_clause12803 = new BitSet(new long[]{0x1000000001008400L,0x0000000000000100L});
    public static final BitSet FOLLOW_alias_in_xml_namespaces_clause12805 = new BitSet(new long[]{0x4000000000001000L,0x0000000000100000L});
    public static final BitSet FOLLOW_COMMA_in_xml_namespaces_clause12827 = new BitSet(new long[]{0x1400000025088C20L,0x2008100030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_concatenation_wrapper_in_xml_namespaces_clause12830 = new BitSet(new long[]{0x1000000001008400L,0x0000000000000100L});
    public static final BitSet FOLLOW_alias_in_xml_namespaces_clause12832 = new BitSet(new long[]{0x4000000000001000L,0x0000000000100000L});
    public static final BitSet FOLLOW_xml_general_default_part_in_xml_namespaces_clause12854 = new BitSet(new long[]{0x4000000000000000L});
    public static final BitSet FOLLOW_RIGHT_PAREN_in_xml_namespaces_clause12866 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_xml_column_name_in_xml_table_column12887 = new BitSet(new long[]{0x1000000000008000L,0x0000000080000000L});
    public static final BitSet FOLLOW_for_key_in_xml_table_column12898 = new BitSet(new long[]{0x1000000000000000L});
    public static final BitSet FOLLOW_ordinality_key_in_xml_table_column12900 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_type_spec_in_xml_table_column12911 = new BitSet(new long[]{0x1000000000000002L,0x0000000000100000L});
    public static final BitSet FOLLOW_path_key_in_xml_table_column12914 = new BitSet(new long[]{0x1400000025088C20L,0x2008100030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_concatenation_wrapper_in_xml_table_column12916 = new BitSet(new long[]{0x0000000000000002L,0x0000000000100000L});
    public static final BitSet FOLLOW_xml_general_default_part_in_xml_table_column12926 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_default_key_in_xml_general_default_part12982 = new BitSet(new long[]{0x1400000025088C20L,0x2008100030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_concatenation_wrapper_in_xml_general_default_part12985 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_expression_in_xml_multiuse_expression_element13013 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000100L});
    public static final BitSet FOLLOW_as_key_in_xml_multiuse_expression_element13016 = new BitSet(new long[]{0x1000000000008000L});
    public static final BitSet FOLLOW_id_expression_in_xml_multiuse_expression_element13019 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_evalname_key_in_xml_multiuse_expression_element13023 = new BitSet(new long[]{0x1400000025088C20L,0x2008100030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_concatenation_in_xml_multiuse_expression_element13025 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_version_key_in_xmlroot_param_version_part13136 = new BitSet(new long[]{0x1400000025088C20L,0x2008180030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_no_key_in_xmlroot_param_version_part13140 = new BitSet(new long[]{0x1000000000000000L});
    public static final BitSet FOLLOW_value_key_in_xmlroot_param_version_part13142 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_expression_wrapper_in_xmlroot_param_version_part13144 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_standalone_key_in_xmlroot_param_standalone_part13165 = new BitSet(new long[]{0x1000000000000000L});
    public static final BitSet FOLLOW_yes_key_in_xmlroot_param_standalone_part13169 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_no_key_in_xmlroot_param_standalone_part13171 = new BitSet(new long[]{0x1000000000000002L});
    public static final BitSet FOLLOW_value_key_in_xmlroot_param_standalone_part13173 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_encoding_key_in_xmlserialize_param_enconding_part13195 = new BitSet(new long[]{0x1400000025088C20L,0x2008100030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_concatenation_wrapper_in_xmlserialize_param_enconding_part13198 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_version_key_in_xmlserialize_param_version_part13218 = new BitSet(new long[]{0x1400000025088C20L,0x2008100030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_concatenation_wrapper_in_xmlserialize_param_version_part13221 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_no_key_in_xmlserialize_param_ident_part13241 = new BitSet(new long[]{0x1000000000000000L});
    public static final BitSet FOLLOW_indent_key_in_xmlserialize_param_ident_part13243 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_indent_key_in_xmlserialize_param_ident_part13254 = new BitSet(new long[]{0x0000000000000002L,0x0100000000000000L});
    public static final BitSet FOLLOW_size_key_in_xmlserialize_param_ident_part13258 = new BitSet(new long[]{0x0000000000040000L});
    public static final BitSet FOLLOW_EQUALS_OP_in_xmlserialize_param_ident_part13261 = new BitSet(new long[]{0x1400000025088C20L,0x2008100030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_concatenation_wrapper_in_xmlserialize_param_ident_part13264 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_order_key_in_synpred1_PLSQL_DMLParser710 = new BitSet(new long[]{0x1000000000000000L,0x0000000000002000L});
    public static final BitSet FOLLOW_siblings_key_in_synpred1_PLSQL_DMLParser712 = new BitSet(new long[]{0x0000000000000000L,0x0000000000002000L});
    public static final BitSet FOLLOW_by_key_in_synpred1_PLSQL_DMLParser715 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_distinct_key_in_synpred2_PLSQL_DMLParser979 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_unique_key_in_synpred2_PLSQL_DMLParser981 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_all_key_in_synpred2_PLSQL_DMLParser983 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_tableview_name_in_synpred3_PLSQL_DMLParser1316 = new BitSet(new long[]{0x0000000400000000L});
    public static final BitSet FOLLOW_PERIOD_in_synpred3_PLSQL_DMLParser1318 = new BitSet(new long[]{0x0000000000000080L});
    public static final BitSet FOLLOW_ASTERISK_in_synpred3_PLSQL_DMLParser1320 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_LEFT_PAREN_in_synpred4_PLSQL_DMLParser1863 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_select_key_in_synpred5_PLSQL_DMLParser2326 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_any_key_in_synpred6_PLSQL_DMLParser2352 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_LEFT_PAREN_in_synpred7_PLSQL_DMLParser2557 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_LEFT_PAREN_in_synpred8_PLSQL_DMLParser2927 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_COMMA_in_synpred9_PLSQL_DMLParser3145 = new BitSet(new long[]{0x1400000025088C20L,0x2008180030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_group_by_elements_in_synpred9_PLSQL_DMLParser3147 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_rollup_key_in_synpred10_PLSQL_DMLParser3356 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_cube_key_in_synpred10_PLSQL_DMLParser3358 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_LEFT_PAREN_in_synpred11_PLSQL_DMLParser3374 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_all_key_in_synpred12_PLSQL_DMLParser4043 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_LEFT_PAREN_in_synpred13_PLSQL_DMLParser6221 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_unlimited_key_in_synpred14_PLSQL_DMLParser6312 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_select_key_in_synpred15_PLSQL_DMLParser8088 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_interval_expression_in_synpred16_PLSQL_DMLParser8425 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_any_key_in_synpred17_PLSQL_DMLParser8664 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_any_key_in_synpred18_PLSQL_DMLParser8679 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_select_key_in_synpred19_PLSQL_DMLParser9033 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_LEFT_PAREN_in_synpred20_PLSQL_DMLParser9057 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_label_name_in_synpred21_PLSQL_DMLParser9429 = new BitSet(new long[]{0x0000000000000000L,0x0000000000004000L});
    public static final BitSet FOLLOW_case_key_in_synpred21_PLSQL_DMLParser9432 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000008L});
    public static final BitSet FOLLOW_when_key_in_synpred21_PLSQL_DMLParser9434 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_select_key_in_synpred22_PLSQL_DMLParser9792 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_default_key_in_synpred23_PLSQL_DMLParser12850 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_default_key_in_synpred24_PLSQL_DMLParser12922 = new BitSet(new long[]{0x0000000000000002L});

}